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
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
exit 0
, zakończy działanie z kodem zakończenia 0 niezależnie od tego, co dzieje się w skrypcie.exit 0
, zakończy działanie z kodem 0 tylko wtedy, gdy ostatnia instrukcja została wykonana. Jedynym wpływemexit 0
na końcu skryptu jest zwrócenie 0 zamiast stanu z poprzedniej instrukcji.exit 0
w dowolnym momencie, zwróci kod zakończenia 0 niezależnie od tego, co wydarzyło się wcześniej.