Mam taki skrypt basha:
rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $?
Po wykonaniu tego skryptu zwraca wartość do następnego procesu, ale mimo że skrypt został pomyślnie uruchomiony i wszystkie etapy skryptu zostały pomyślnie zakończone, zwraca 1.
Ponieważ to – następny proces nie ma miejsca.
Jeśli usunę instrukcję return, następny proces będzie przebiegał gładko. ten problem pojawił się po gradacji klastra Hadoop w górę, która ma Ubuntu 14 i nowy klaster ma Ubuntu 16.
Czy możesz nam pomóc zrozumieć, na czym polega problem i jak następny proces przebiega pomyślnie, jeśli usuniesz polecenie powrotu tutaj i jaki będzie wpływ na produkcję, jeśli usuniesz instrukcję Return?
Komentarze
- jaki jest następny krok? co dokładnie sprawdza następny krok?
- Następny to HQL (kwerenda gałęzi w Hadoop) i zawiera kilka kroków biznesowych, które uruchamia, jeśli skomentuję wartość zwracaną, działa dobrze, ale nie działa, jeśli skomentuję powrót. mam ' t zmienia cokolwiek w logice biznesowej / skrypcie powłoki jedyną rzeczą jaką zrobiliśmy jest aktualizacja
Odpowiedź
Instrukcja return
zwraca błąd, jeśli instrukcja nie jest wykonywana z funkcji.
W funkcjach powłoki, użyj return
. W skryptach użyj exit
.
Krótki skrypt, taki jak
#!/bin/bash return 0
utworzy komunikat o błędzie
line 1: return: can only `return" from a function or sourced script
i ustawi $?
na 1.
Jeśli nie „t wyjdź ze skryptu z jawnym exit
(lub jeśli wyjdziesz za pomocą exit
, ale bez określenia kodu zakończenia), kod powrotu skrypt jako całość będzie taki sam jak ostatnie wykonane polecenie.
Posiadanie exit "$?"
jest tym samym, co zwykły exit
, a jeśli znajduje się na końcu skryptu, można to całkowicie pominąć.
Ogólnie sugeruję również użycie $HOME
zamiast tyldy w skryptach. Dzieje się tak, ponieważ $HOME
działa jak każda inna zmienna, podczas gdy tylda jest rozwijana w oddzielnym kroku rozwijania, co oznacza, że nie zachowuje się jak zmienna i nie jest rozwijana w cudzysłowach . $HOME
jest również bardziej opisowy, a ponieważ jest to skrypt, możesz wydać kilka dodatkowych naciśnięć klawiszy, aby uczynić kod bardziej czytelnym.
Komentarze
- Mam szybkie zapytanie powyżej twojej odpowiedzi .. spróbuję powyżej z istniejącym 0, ale mam jedno pytanie, dlaczego ten problem występuje teraz tylko wstępnie, używam tego samego zapytania? działa, jeśli komentarz zwraca czy ma to jakiś wpływ?
- @gsrao Jeśli skomentujesz instrukcję
return
, kod powrotu skryptu będzie taki sam, jak ostatnio wykonanego polecenia, więc w twoim przypadku tutaj zdecydowanie możesz to pominąć. Dodam to do mojej odpowiedzi. - Och … świetnie … ratujesz mi życie, więc moja sprawa, jeśli domyślnie skomentuję zwrot skrypt zwróci flagę pomyślnego ostatniego komentarza (rmdir ~ / sqoop / " $ TABLE ") prawda? .. tutaj, mimo że odpowiedź działa ja, jeśli dwa proste zapytania, które zżerają mój mózg 1) mój przypadek, po co jest " return $? " tak jak powiedziałeś, będzie działać tak samo, jeśli skomentuję " return $ " 2) co może być przyczyną problemu wcześniej?
- @gsrao Tak, jeśli skomentujesz
return
(który nie powinien ' nie być na początku, ponieważ ' nie jest funkcją, o ile widzę ), stan wyjścia skryptu będzie taki jakrmdir
, jeśli to ' jest ostatnim poleceniem w skrypcie. Jeśli chodzi o Twoje ostatnie pytanie, nie ' nie rozumiem, co masz na myśli przez " wcześniejszy problem ". - Moje ostatnie pytanie… Używam tego samego skryptu, którego używałem przed gradacją linux / klastra, który działał do gradacji w górę klastra, dlaczego teraz występuje tylko ten problem? co może być przyczyną tego problemu?