Bash: Коды выхода со специальными значениями

Коды завершения приложений со специальными значениями

Код выхода Значение Пример Комментарии
1 Подборка для общих ошибок let "var1 = 1/0" Различные ошибки, такие как "деление на ноль" и другие недопустимые операции
2 Неправильное использование встроенных модулей оболочки (согласно документации Bash) empty_function() {} Отсутствующее ключевое слово или команда, или проблема с разрешением (и код возврата diff при неудачном сравнении двоичных файлов).
126 Вызванная команда не может быть выполнена /dev/null Проблема с разрешением или команда не является исполняемым файлом
127 Команда не найдена illegal_command Возможная проблема с $PATH или опечатка
128 Неверный аргумент для выхода exit 3.14159 exit принимает только целочисленные аргументы в диапазоне 0 - 255 (см. первую сноску)
128+n Сигнал фатальной ошибки "n" kill -9 $PPID of script $? возвращает 137 (128 + 9)
130 Сценарий завершен по Control-C Ctl-C Control-C - сигнал фатальной ошибки 2, (130 = 128 + 2, см. выше)
255* Статус выхода вне диапазона exit -1 exit принимает только целочисленные аргументы в диапазоне 0 - 255

Согласно приведенной выше таблице, коды выхода 1 - 2, 126 - 165 и 255имеют специальные значения, и поэтому их следует избегать для заданных пользователем параметров выхода. Завершение сценария с кодом выхода 127, безусловно, приведет к путанице при устранении неполадок (код ошибки - это "команда не найдена" или пользовательский код?). Однако многие сценарии используют выход 1 в качестве общего после ошибки. Поскольку код выхода 1 означает так много возможных ошибок, он не особенно полезен при отладке.

Была попытка систематизировать номера статусов выхода (см. /usr/include/sysexits.h), но это предназначено для программистов на C и C++. Аналогичный стандарт для сценариев может быть уместен. Автор этого документа предлагает ограничить определяемые пользователем коды выхода диапазоном 64 - 113 (в дополнение к 0, для успеха), чтобы соответствовать стандарту C/C++. Это позволит ограничиться 50 допустимыми кодами и сделает скрипты поиска и устранения неисправностей более простыми. Все определяемые пользователем коды завершения в сопроводительных примерах к этому документу соответствуют этому стандарту, за исключением случаев, когда существуют отменяющие обстоятельства.

  • Выдача $? из командной строки после выхода из сценария оболочки дает результаты, соответствующие приведенной выше таблице, только в приглашении Bash или sh. Запуск C-shell или tcsh в некоторых случаях может дать другие значения.
  • Значения выхода вне диапазона могут привести к неожиданным кодам выхода. Значение выхода больше 255 возвращает код выхода по модулю 256. Например, выход 3809 дает код выхода 225 (3809 % 256 = 225).
  • Обновление /usr/include/sysexits.h выделяет ранее не использовавшиеся коды выхода с 64 по 78. Можно ожидать, что в будущем диапазон нераспределенных кодов выхода будет еще более ограничен. Автор этого документа не будет исправлять примеры сценариев, чтобы привести их в соответствие с изменяющимся стандартом. Это не должно вызвать никаких проблем, так как нет никакого дублирования или конфликта в использовании кодов выхода между скомпилированными двоичными файлами C/C++ и сценариями оболочки.
Понравилась статья? Поделиться с друзьями:
Добавить комментарий