Kod zakończenia na końcu skryptu bash

Nie mam pewności co do znaczenia kodu zakończenia na końcu skryptu bash: znam ten kod zakończenia 0 oznacza, że zakończyło się pomyślnie i jest o wiele więcej numerów kodów zakończenia (127, jeśli się nie mylę?)

Moje pytanie dotyczy widoku kodu zakończenia 0 na końcu skryptu, czy wymusza kod zakończenia na 0, nawet jeśli skrypt się nie powiódł lub ma inne znaczenie?

Komentarze

  • Jeśli skrypt kończy się na exit 0, zakończy działanie z kodem zakończenia 0 niezależnie od tego, co dzieje się w skrypcie.
  • @Hatclock dlaczego nie ' Czy opublikujesz swoją odpowiedź jako pełną deklarowaną odpowiedź? jako komentarz nie mogę jej oznaczyć i nie ' Nie sądzę, że otrzymujesz fałszywe punkty internetowe za odpowiedź (prawda?) Tylko jedna myśl. .. (chwała za szybką odpowiedź)
  • Jestem ' m na stacji kolejowej w moim telefonie, nie Naprawdę lubię pisać za dużo na moim telefonie. Jednak ilkkachu wydaje się mieć dobrą odpowiedź!
  • @Hatclock Nie, wcale. Jeśli skrypt kończy się na exit 0, zakończy działanie z kodem 0 tylko wtedy, gdy ostatnia instrukcja została wykonana. Jedynym wpływem exit 0 na końcu skryptu jest zwrócenie 0 zamiast stanu z poprzedniej instrukcji.
  • @Gilles To było bardziej niejednoznaczne sformułowana odpowiedź z mojej strony. Jeśli skrypt uruchomi się exit 0 w dowolnym momencie, zwróci kod zakończenia 0 niezależnie od tego, co wydarzyło się wcześniej.

Odpowiedź

Wbudowane polecenie exit wychodzi z powłoki (z Bash „s odniesienie ):

exit [n]
Wyjdź z powłoki, zwracając stan n do elementu nadrzędnego powłoki. Jeśli pominięto n, kod zakończenia jest taki sam jak ostatnio wykonanego polecenia. Każda pułapka na EXIT jest wykonywana przed zakończeniem działania powłoki.

Uruchomienie do końca pliku również kończy działanie, zwracając kod powrotu ostatniego polecenia, więc tak, końcowe exit 0 spowoduje zakończenie skryptu z pomyślnym statusem niezależnie od statusu wyjścia poprzednie polecenia. (to znaczy zakładając, że skrypt dotrze do ostatniego exit). Na końcu skryptu można również użyć true lub , aby uzyskać zerowy kod zakończenia.

Oczywiście częściej” d używasz exit z wnętrza if, aby zakończyć skrypt w środku.

Powinny one wypisać 1 ($? zawiera kod zakończenia zwrócony przez poprzednie polecenie) :

sh -c "false" ; echo $? sh -c "false; exit" ; echo $? 

Chociaż powinno to wypisać 0:

sh -c "false; exit 0" ; echo $? 

Nie upewnij się, że koncepcja „niepowodzenia” skryptu podczas wykonywania exit ma sens, ponieważ jest całkiem możliwe, że niektóre polecenia uruchamiane przez skrypt zawiodą, ale sam skrypt się powiedzie . Do autora skryptu należy decyzja, co jest sukcesem, a co nie.

Ponadto standardowy zakres kodów zakończenia to 0..255. Kody powyżej 127 są używane przez powłokę do wskazania procesu zakończonego sygnałem, ale mogą zostać zwrócone w zwykły sposób. Wywołanie systemowe wait w rzeczywistości zwraca szerszą wartość, a reszta zawiera bity stanu ustawione przez system operacyjny.

Komentarze

  • Super, nie ' nie wiem o 8-bitowej numeracji kodów wyjścia. Dzięki!
  • Zauważ, że kiedy proces jest zabijany, nie kończy pracy z kodem zakończenia > 127. It ' to po prostu to, że niektóre powłoki ustawiają $? na 128 + signum w tym przypadku. Zobacz Domyślny kod zakończenia po zakończeniu procesu? , aby uzyskać szczegółowe informacje.
  • exit 0 zwróci tylko 0, jeśli wyjście zostanie wykonane. (może zakończyć się inną drogą).

Odpowiedź

0 oznacza sukces, dodatnie liczby całkowite oznaczają porażkę. Istnieje 255 różnych kodów błędów, ale wartości 126 i wyższe są zarezerwowane, aby wskazać, że program nie mógł się uruchomić (126 lub 127) lub został zabity przez sygnał (129 i więcej). Patrz Domyślny kod zakończenia po zakończeniu procesu? i Jakich wartości powrotu / wyjścia mogę używać w funkcjach / skryptach basha? , aby uzyskać więcej informacji.

Status wyjścia skryptu powłoki to kod zakończenia ostatniego polecenia wykonanego przez skrypt. Na przykład

#!/bin/sh somecommand 

zwraca status wyjścia somecommand, podczas gdy

#!/bin/sh somecommand exit 0 

zwraca 0 niezależnie od tego, co somecommand wrócił.Ten drugi skrypt można również napisać

#!/bin/sh somecommand true 

Umieszczenie exit 0 na końcu skryptu niekoniecznie musi powodować zwraca 0. To sprawia, że zwraca 0 dopiero po osiągnięciu końca skryptu. Na przykład następujący skrypt zawsze zwraca 3:

#!/bin/sh exit 3 exit 0 

następujący skrypt również zawsze zwraca kod błędu, oprócz wyświetlenia komunikatu o błędzie składni:

#!/bin/sh } exit 0 

Poniższy skrypt zwraca 1 lub 0 w zależności od pierwszy argument:

#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0 

Poniższy skrypt zwraca stan somecommand, ponieważ set -e powoduje zamknięcie skryptu, jeśli somecommand zawiedzie:

#!/bin/sh set -e somecommand exit 0 

Dodaj komentarz

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