Відповіді:
Немає "рецепту" для отримання значень стану виходу даної термінальної команди.
Моєю першою спробою буде введення сторінки:
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).
Друге : Google . Дивіться wget як приклад.
Третє : статуси виходу оболонки, наприклад bash. Bash і його вбудовані можуть спеціально використовувати значення вище 125. 127 для команди не знайдено, 126 для команди не виконується. Для отримання додаткової інформації дивіться коди виходу bash .
Вихідні коди вказують на стан відмови під час завершення програми, і вони падають між 0 і 255. Оболонка та її вбудовані можуть використовувати особливо значення вище 125 для позначення конкретних режимів відмови, тому список кодів може змінюватись між оболонками та операційними системами (наприклад, Bash використовує значення 128 + N як статус виходу). Див.: Bash - 3.7.5 Вихід стану або man bash
.
Взагалі статус нульового виходу вказує на те, що команда успішна , ненульовий статус виходу вказує на збій .
Щоб перевірити, який код помилки повертається командою, ви можете надрукувати $?
останній код виходу або ${PIPESTATUS[@]}
який дає список значень статусу виходу з конвеєра (на Bash) після виходу сценарію оболонки.
Немає повного списку всіх кодів виходу, які можна знайти, проте була спроба систематизувати номери статусу виходу у джерелі ядра, але це головне, призначене для програмістів C / C ++ і подібний стандарт для сценаріїв може бути доречним.
Деякий список сисекситів як для Linux, так і для BSD / OS X з переважними кодами виходу програм (64-78) можна знайти в /usr/include/sysexits.h
(або: man sysexits
на 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 */
Вищенаведений список виділяє раніше не використані коди виходу з 64-78. Діапазон необмежених кодів виходу буде надалі обмежений.
Однак вищезгадані значення в основному використовуються у sendmail і використовуються майже ніким, тому вони не є чимось віддаленим від стандарту (як вказував @Gilles ).
У оболонці статус виходу такий (на основі Bash):
1
- 125
- Команда не завершилася успішно. Ознайомтеся зі сторінкою команди команди на значення статусу, кілька прикладів нижче:
1
- Catchall для загальних помилок
Різні помилки, такі як "ділити на нуль" та інші неприпустимі операції.
Приклад:
$ let "var1 = 1/0"; echo $?
-bash: let: var1 = 1/0: division by 0 (error token is "0")
1
2
- Неправильне використання вбудованих оболонок (згідно документації Bash)
Відсутнє ключове слово чи команда, або проблема дозволу (і різний код повернення при невдалому порівнянні бінарних файлів).
Приклад:
empty_function() {}
6
- Немає такого пристрою чи адреси
Приклад:
$ curl foo; echo $?
curl: (6) Could not resolve host: foo
6
124
- тайм-аут команди
125
- якщо сама команда не вдається переглянути: coreutils126
- якщо команда знайдена, але її не можна викликати (наприклад, не виконується)
Проблема або команда дозволу не є виконуваним.
Приклад:
$ /dev/null
$ /etc/hosts; echo $?
-bash: /etc/hosts: Permission denied
126
127
- якщо команду неможливо знайти, дочірній процес, створений для її виконання, повертає цей статус
Можлива проблема
$PATH
або помилка друку.
Приклад:
$ foo; echo $?
-bash: foo: command not found
127
128
- Недійсний аргумент на exit
вихід приймає лише цілі аргументи в діапазоні 0 - 255.
Приклад:
$ exit 3.14159
-bash: exit: 3.14159: numeric argument required
128
- 254
- сигнал фатальної помилки "n" - команда загинула через отримання сигналу. Код сигналу додається до 128 (128 + SIGNAL), щоб отримати статус (Linux:, man 7 signal
BSD:) man signal
, кілька прикладів нижче:
130
- команда припиняється через натискання Ctrl-C, 130-128 = 2 (SIGINT)
Приклад:
$ cat
^C
$ echo $?
130
137
- якщо команда надсилає KILL(9)
сигнал (128 + 9), стан виходу команди в іншому випадку
kill -9 $PPID
сценарію.
141
- SIGPIPE
- пишіть на трубі без читача
Приклад:
$ 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
- команда, що припиняється за сигнальним кодом 15 (128 + 15 = 143)
Приклад:
$ sleep 5 && killall sleep &
[1] 19891
$ sleep 100; echo $?
Terminated: 15
143
255
* - статус виходу за межі діапазону.
вихід приймає лише цілі аргументи в діапазоні 0 - 255.
Приклад:
$ sh -c 'exit 3.14159'; echo $?
sh: line 0: exit: 3.14159: numeric argument required
255
Згідно з наведеною вище таблицею, коди виходу 1 - 2, 126 - 165 та 255 мають особливі значення, і тому слід уникати вказаних користувачем параметрів виходу.
Зверніть увагу, що значення поза виходом із діапазону можуть призвести до несподіваних кодів виходу (наприклад, вихід 3809 дає код виходу 225, 3809% 256 = 225).
Побачити:
errno
Значення використовуються системними API, вони не використовуються як статуси виходу (вони навіть не в потрібному діапазоні) і не мають значення для сценаріїв оболонок. Значення сисекситів - від sendmail і використовуються майже ніхто інший, вони нічим не віддалені від стандартних.
Вам доведеться переглянути код / документацію. Однак річ, яка найбільше наближається до "стандартизації", - це errno.h
errno.h
не має значення, коли мова заходить про вихідні коди, лише повідомлення про помилки.
sysexits.h
. Однак деякі програми повертають errno
s, і я фактично думаю, що повернення errno
s має найбільш сенс. Нерозроблені errno
s поширюються вгору, як винятки, ( errno
повернення, функції повертаються, наприклад, -1
або 0|NULL
). Оскільки програми - це лише функції, хоча функції, які виконуються в окремому просторі адреси, має сенс, що програма може захотіти продовжувати errno
поширення через межу процесу.
"($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
.
Наскільки я знаю, є лише два, більш-менш-менш, стандартних значення - обидва визначені stdlib.h
для використання з exit ():
І єдине фактичне стандартне значення, тобто таке, що має однакове значення для всіх програм у світі, - 0 (нуль), що означає УСПІХ.
Різні програми вводять різні списки повернених "невдач" -кодів, щоб розрізнити або підкреслити різні помилки (різного типу або тяжкості). Деякі програми навіть використовують повернене значення, щоб повідомити про цілу кількість виявлених помилок виконання (наприклад, кількість невдалих одиничних тестів у костюмі).
Я б не рекомендував вводити будь-який "новий стандарт", що розширює stdlib.h