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?