Błąd wartości zwracanej w skryptach basha

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 jak rmdir, 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?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *