Jak uzyskać listę kodów wyjścia (i / lub kodów powrotu) i znaczenie dla polecenia / narzędzia?


17

Czy istnieje sposób, w jaki mogę zrobić to, co podano w tytule poleceń terminalu, czy będę musiał sprawdzić kody?

Odpowiedzi:


15

Nie ma „przepisu”, aby uzyskać znaczenie statusu wyjścia danej komendy terminalu.

Moja pierwsza próba to strona man:

user@host:~# man ls 
   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).

Po drugie : Google . Zobacz wget jako przykład.

Po trzecie : Stany wyjścia powłoki, na przykład bash. Bash i jego wbudowane funkcje mogą używać wartości powyżej 125 specjalnie. 127 dla polecenia nie znaleziono, 126 dla polecenia nie jest wykonywalny. Aby uzyskać więcej informacji, zobacz kody wyjścia bash .


tak, niektórzy ludzie, informacje, ... strony zawierają je ... i martwiłem się tymi, którzy tego nie zrobili. ..i wiem, że wyszukiwanie w Internecie jest zawsze możliwe. .. jak na razie wydaje się, że to tylko kody wyjściowe bash, których musiałem szukać ...
dokładnie

12

Kody zakończenia wskazują stan awarii podczas kończenia programu i mieszczą się w zakresie od 0 do 255. Powłoka i jej wbudowane funkcje mogą używać szczególnie wartości powyżej 125 do wskazania określonych trybów awarii, więc lista kodów może się różnić w zależności od powłoki i systemu operacyjnego (np. Bash używa wartości 128 + N jako statusu wyjścia). Patrz: Bash - 3.7.5 Status wyjścia lub man bash.

Ogólnie zerowy status wyjścia wskazuje, że polecenie się powiodło , niezerowy status wyjścia oznacza błąd .

Aby sprawdzić, który kod błędu jest zwracany przez polecenie, możesz wydrukować $?dla ostatniego kodu wyjścia lub ${PIPESTATUS[@]}który podaje listę wartości statusu wyjścia z potoku (w Bash) po wyjściu ze skryptu powłoki.

Nie ma pełnej listy wszystkich kodów wyjścia, które można znaleźć, jednak podjęto próbę usystematyzowania numerów statusu wyjścia w źródle jądra, ale jest to głównie przeznaczone dla programistów C / C ++ i podobny standard skryptowania może być odpowiedni.

Niektóre listy sysexits zarówno w systemie Linux, jak i BSD / OS X z preferowanymi kodami wyjścia dla programów (64-78) można znaleźć w /usr/include/sysexits.h(lub: man sysexitsna BSD):

0   /* successful termination */
64  /* base value for error messages */
64  /* command line usage error */
65  /* data format error */
66  /* cannot open input */
67  /* addressee unknown */
68  /* host name unknown */
69  /* service unavailable */
70  /* internal software error */
71  /* system error (e.g., can't fork) */
72  /* critical OS file missing */
73  /* can't create (user) output file */
74  /* input/output error */
75  /* temp failure; user is invited to retry */
76  /* remote error in protocol */
77  /* permission denied */
78  /* configuration error */
/* maximum listed value */

Powyższa lista przydziela wcześniej nieużywane kody wyjścia z 64-78. Zakres nieprzydzielonych kodów wyjścia będzie dalej ograniczony w przyszłości.

Jednak powyższe wartości są używane głównie w sendmailu i używane przez prawie nikogo innego, więc nie są niczym zbliżonym do standardu (jak wskazuje @Gilles ).

W powłoce status wyjścia jest następujący (na podstawie Bash):

  • 1- 125- Polecenie nie zostało zakończone pomyślnie. Sprawdź stronę podręcznika polecenia pod kątem znaczenia statusu, kilka przykładów poniżej:

  • 1 - Catchall dla ogólnych błędów

    Różne błędy, takie jak „dziel przez zero” i inne niedozwolone operacje.

    Przykład:

    $ let "var1 = 1/0"; echo $?
    -bash: let: var1 = 1/0: division by 0 (error token is "0")
    1
    
  • 2 - Niewłaściwe użycie wbudowanych powłok (zgodnie z dokumentacją Bash)

    Brakujące słowo kluczowe lub polecenie lub problem z uprawnieniami (i kod powrotu diff przy nieudanym porównaniu pliku binarnego).

    Przykład:

     empty_function() {}
    
  • 6 - Brak takiego urządzenia lub adresu

    Przykład:

    $ curl foo; echo $?
    curl: (6) Could not resolve host: foo
    6
    
  • 124 - upłynął limit czasu poleceń

  • 125- jeśli samo polecenie nie powiedzie się, zobacz: coreutils
  • 126 - jeśli komenda została znaleziona, ale nie można jej wywołać (np. nie jest wykonywalna)

    Problem z uprawnieniami lub polecenie nie jest plikiem wykonywalnym.

    Przykład:

    $ /dev/null
    $ /etc/hosts; echo $?
    -bash: /etc/hosts: Permission denied
    126
    
  • 127 - jeśli nie można znaleźć polecenia, proces potomny utworzony w celu jego wykonania zwraca ten status

    Możliwy problem z $PATHliterówką.

    Przykład:

    $ foo; echo $?
    -bash: foo: command not found
    127
    
  • 128 - Nieprawidłowy argument dla exit

    Wyjście przyjmuje tylko argumenty całkowite z zakresu 0 - 255.

    Przykład:

    $ exit 3.14159
    -bash: exit: 3.14159: numeric argument required
    
  • 128- 254- sygnał błędu krytycznego „n” - polecenie wygasło z powodu otrzymania sygnału. Kod sygnału jest dodawany do 128 (128 + SYGNAŁ), aby uzyskać status (Linux man 7 signal:, BSD:) man signal, kilka przykładów poniżej:

  • 130 - polecenie zakończone z powodu naciśnięcia Ctrl-C, 130-128 = 2 (SIGINT)

    Przykład:

    $ cat
    ^C
    $ echo $?
    130
    
  • 137- jeśli polecenie zostanie wysłane KILL(9)sygnał (128 + 9), w przeciwnym razie status wyjścia polecenia

    kill -9 $PPID skryptu.

  • 141- SIGPIPE- pisz na rurze bez czytnika

    Przykład:

    $ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
    $ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
    xargs: cat: terminated by signal 13
    $ echo ${PIPESTATUS[@]}
    0 125 141
    
  • 143 - komenda zakończona kodem sygnałowym 15 (128 + 15 = 143)

    Przykład:

    $ sleep 5 && killall sleep &
    [1] 19891
    $ sleep 100; echo $?
    Terminated: 15
    143
    
  • 255* - wyjście ze stanu poza zakresem.

    Wyjście przyjmuje tylko argumenty całkowite z zakresu 0 - 255.

    Przykład:

    $ sh -c 'exit 3.14159'; echo $?
    sh: line 0: exit: 3.14159: numeric argument required
    255
    

Zgodnie z powyższą tabelą kody wyjścia 1 - 2, 126 - 165 i 255 mają specjalne znaczenie i dlatego należy ich unikać w przypadku parametrów wyjścia określonych przez użytkownika.

Należy pamiętać, że wartości wyjściowe poza zakresem mogą powodować nieoczekiwane kody wyjścia (np. Wyjście 3809 daje kod wyjścia 225, 3809% 256 = 225).

Widzieć:


errnowartości są używane przez systemowe interfejsy API, nie są używane jako statusy wyjścia (nie są nawet w odpowiednim zakresie) i nie mają znaczenia dla skryptów powłoki. Wartości Sysexits pochodzą z sendmaila i są używane prawie przez nikogo innego, nie są niczym zbliżonym do standardu.
Gilles „SO- przestań być zły”

7

Będziesz musiał zajrzeć do kodu / dokumentacji. Jednak najbardziej zbliżoną do „standaryzacji” jest errno.h


dzięki za wskazanie pliku nagłówka .. spróbowałem przejrzeć dokumentację kilku narzędzi .. trudno znaleźć kody wyjścia, wydaje się, że większość będzie stderrami ...
dokładnie

3
errno.hnie ma znaczenia, jeśli chodzi o kody wyjścia, tylko komunikaty o błędach.
Gilles „SO- przestań być zły”

Większość programów zwraca kody wyjścia zgodnie z konwencją BSD, jak określono w sysexits.h. Jednak niektóre programy zwracają errnos i myślę, że zwracanie errnos ma jak najbardziej sens. Nieobsługiwane errnos rozprzestrzeniają się w górę, jak wyjątki, ( errnopozostaje, funkcje zwracają np. -1Lub 0|NULL). Ponieważ programy są tylko funkcjami, chociaż są one uruchamiane w osobnej przestrzeni adresowej, sensowne jest, aby program mógł kontynuować errnopropagację poza granicami procesu.
PSkocik

@PSkocik, czy masz przykład takiego polecenia? errnos nie są przenośne (wartości nie są spójne w różnych systemach) i nie ma przenośnego sposobu na uzyskanie nazwy lub komunikatu err od wartości (zsh ma do tego wbudowane). Nie wspominając o tym, że niektóre systemy mają errnos powyżej 123, które kolidowałyby ze wspólnymi kodami błędów o specjalnym znaczeniu . Zwykle polecenia drukują komunikaty z errno i zwracają status wyjścia z powodzenia / niepowodzenia. polecenia są przeznaczone dla użytkowników. funkcje / wywołania systemowe są przeznaczone dla programistów.
Stéphane Chazelas,

@ StéphaneChazelas Widziałem to kilka razy, ale nie w żadnych dobrze ustalonych programach, muszę przyznać. Ostatnio osobiście zwracam errno + 1 w moim systemie zabawek (tak, że 1 nadal oznacza „każdy błąd”), ponieważ myślę, że serializowanie errno przez granicę procesu ma większy sens niż tłumaczenie zgodnie z konwencją BSD, ponieważ wykonanie programu jest w zasadzie wywołania funkcji, a funkcje używają errno. Używam własnego dekodera statusu ostatniego wyjścia w PROMPT_COMMAND (bash), więc otrzymuję coś takiego "($numeric_code|$bsd_decoded|$errno_plus_one_decoded)".
PSkocik,

1

O ile mi wiadomo, istnieją tylko dwie, mniej więcej, standardowe wartości - obie zdefiniowane w stdlib.hcelu użycia z exit ():

  • EXIT_SUCCESS (= 0)
  • EXIT_FAILURE (= 1)

A jedyną de facto standardową wartością, tj. Mającą takie samo znaczenie dla wszystkich programów na świecie, jest 0 (zero), co oznacza SUKCES.

Różne programy wprowadzają różne listy zwracanych kodów „awarii” w celu rozróżnienia lub podkreślenia różnych błędów (różnych typów lub ważności). Niektóre programy używają nawet zwracanej wartości do zgłaszania liczby całkowitej wykrytych błędów środowiska wykonawczego (np. Liczby nieudanych testów jednostkowych w kolorze).

Nie polecałbym wprowadzenia żadnego „nowego standardu” rozszerzającego stdlib.h

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.