Исходя из ответов, которые я получил (было сложно выбрать один из них), не вредно указывать определенные типы ошибок с помощью кода завершения, который также использует Bash. Bash (или любая другая оболочка Unix) не будет делать ничего особенного (например, запускать обработчики исключений), если пользовательский скрипт завершает работу с одним из этих кодов ошибок.
Кажется, что автор Advanced Bash-Scripting Guide согласен с BSD, пытающимся стандартизировать коды выхода ( sysexits.h
), и просто рекомендует, чтобы, когда пользователи пишут сценарии оболочки, они не указывали коды выхода, которые уже конфликтуют с предопределенными кодами выхода в процессе использования, т. е. они ограничивают свои пользовательские коды выхода 50 доступными кодами состояния в диапазоне 64-113.
Я ценю эту идею (и обоснование), но я бы предпочел, чтобы автор был более явным, чтобы игнорировать совет не вредно, за исключением случаев, когда потребитель скрипта проверяет наличие ошибок, таких как приведенный пример 127 ( command not found
).
Соответствующие спецификации POSIX
Я исследовал, что POSIX говорит о кодах выхода, и спецификация POSIX, похоже, совпадает с автором Advanced Bash-Scripting Guide. Я процитировал соответствующие спецификации POSIX (выделено мое):
Состояние выхода для команд
Каждая команда имеет статус выхода, который может влиять на поведение других команд оболочки. Состояние выхода команд, которые не являются утилитами, задокументировано в этом разделе. Статус выхода стандартных утилит задокументирован в соответствующих разделах.
Если команда не найдена, статус выхода должен быть 127. Если имя команды найдено, но это не исполняемая утилита, статус выхода должен быть 126. Приложения, которые вызывают утилиты без использования оболочки, должны использовать эти значения статуса выхода. сообщать о подобных ошибках.
Если команда не выполняется во время раскрытия или перенаправления слова, ее статус выхода должен быть больше нуля.
Внутренне, в целях принятия решения о том, завершается ли команда с ненулевым состоянием выхода, оболочка должна распознать все значение состояния, полученное для команды, эквивалентным макросу WEXITSTATUS функции wait () (как определено в томе System Interfaces POSIX.1-2008). При сообщении о состоянии выхода с помощью специального параметра «?» Оболочка должна сообщать о всех восьми битах доступного состояния выхода. Состояние выхода команды, которая завершилась из-за того, что она получила сигнал, должно быть сообщено как больше 128.
exit
утилиты
Как объяснено в других разделах, определенные значения состояния выхода были зарезервированы для специальных целей и должны использоваться приложениями только для этих целей:
126
- Файл для выполнения найден, но это не была исполняемая утилита.
127
- Утилита для выполнения не найдена.
>128
- Команда была прервана сигналом.
Дальнейшая информация
Что бы это ни стоило, я смог проверить все, кроме одного, из списка кодов выхода со специальными значениями . Эта таблица кодов выхода полезна, поскольку она предоставляет более подробную информацию - и примеры того, как генерировать коды ошибок, документированные в справочнике Bash .
Попытка сгенерировать статус выхода 128
Используя Bash версий 3.2.25 и 4.2.46, я пытался выдать 128 Invalid argument to exit
ошибку, но каждый раз получал 255 (состояние выхода вне диапазона). Например, если exit 3.14159
выполняется как часть сценария оболочки или в интерактивной дочерней оболочке, оболочка завершается с кодом 255
:
$ exit 3.14159
exit
bash: exit: 3.14159: numeric argument required
Для еще большего удовольствия я также попытался запустить простую C-программу, но в этом случае кажется, что exit(3)
функция просто преобразовала число с плавающей точкой в int (в данном случае 3) перед выходом:
#include <stdlib.h>
main()
{
exit(3.14159);
}