Коды завершения приложений со специальными значениями
Код выхода | Значение | Пример | Комментарии |
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++ и сценариями оболочки.