
Я хочу знать, какие возвращаемые значения мы можем использовать, чтобы не возникло ошибок, например, с SIGINT?
бывший.:
$sleep 10
$#hit ctrl+c
$echo $?
130
поэтому я знаю, что не должен использовать ничего подобного return 130
илиexit 130
поэтому это было бы заблуждением:
$function FUNC(){ return 130; };FUNC;echo $?
130
решение1
Статус завершения процесса кодируется как значениеот 0 до 255, так что это все, что вы можете использовать в качестве кода выхода. Если вы передаете значение за пределами этого диапазона, большинство оболочек используют остаток по модулю 256. Некоторые оболочки допускают более широкий диапазон целочисленных значений для функций.
Единственное правило для кодов выхода заключается в том, что0 означает успех, а любое другое значение означает неудачу.. Это правило выходит за рамки unix: это также общепринятое соглашение в других операционных системах (включая DOS, Windows и многие встроенные системы, в которых есть понятие кода выхода, но VMS делает это по-другому). В системах unix оно встроено в логические конструкции оболочки ( if
, while
, &&
, ||
, !
, set -e
, …), в make
, и за ним следуют все стандартные утилиты. В программах POSIX C,EXIT_SUCCESS
равен 0 и EXIT_FAILURE
представляет собой некоторое ненулевое значение (обычно 1).
Не существует правила (де-факто или де-юре) относительно выбора кодов выхода для сбоя. Только несколько утилит POSIX предписывают определенные коды статуса сбоя:
- Оператор
!
оболочки возвращает 1, если его операнд возвращает 0. Оператор&&
и||
передает статус из последней команды. cmp
иdiff
возвращает 1 для разных файлов и ≥2 для ошибочных состояний.expr
возвращает 1, если выражение оценивается как ноль или null, 2 для недопустимого выражения и ≥3 для других ошибок.grep
возвращает 1 для «не найдено» и ≥2 для ошибочных условий. Многие команды поиска следуют этому (но неfind
, которая возвращает 0, если ни один файл не совпадает).mesg
возвращает 0 для ответа «да», 1 для ответа «нет» и ≥2 для ответа «ошибка».patch
возвращает 1, если фрагмент был отклонен, и ≥2 в случае других ошибок.sort -c
возвращает 1, если данные файла не отсортированы, и ≥2 в случае ошибок.compress
иlocaledef
определить некоторые небольшие значения для конкретных ошибок.
Существует распространенная, но не универсальная идея, что большие значения означают худшие сбои. Для команд, которые проверяют булево условие, например grep
(присутствует ли этот шаблон?) и diff
(идентичны ли эти файлы?), 1 означает «нет», а большие значения указывают на ошибку. Кроме того,значения от 126 и выше используются редко, поскольку они встроены в оболочку (и команды POSIX command
, env
, nice
, nohup
и time
):
- 126 и 127 указывают на невозможность вызова внешней команды;
- Значения выше 128
$?
указывают на команду, которая была завершена сигналом.
/usr/include/sysexits.h
перечисляет некоторые значения с их значениями, но это из sendmail, и я никогда не видел его за пределами программ, не связанных с доставкой электронной почты.
Вкратце, возвращайте 0 в случае успеха и 1 или 2 в случае неудачи. Если вам нужно различать случаи неудач, начните с 1 и увеличивайте значение для худших неудач.
решение2
Соглашения о статусе выхода
Технически вы можете использовать любое значение от 0 до 255. Однако существует ряд существующих соглашений, которые вы можете использовать:
- Выходной код 1 каквсеобъемлющий список общих ошибок.
- Коды выхода 64-78 изsysexits.hдля указания класса ошибки. Вы можете посмотреть их в/usr/include/sysexits.h, который устанавливается пакетом Debian/Ubuntu libc6-dev.
- Коды выхода изerrno.h. Вы также можете посмотреть их с помощьюошибкакоманда из пакета moreutils. В моей системе запуск
errno --list
в настоящее время отображает 134 определенных ошибки.
Документ и отображение
В общем, хорошей идеей будет документировать коды выхода, используемые в вашем скрипте, или, по крайней мере, какие соглашения вы соблюдаете. Также может быть полезно отображать отличительное сообщение перед выходом, например:
# using sysexits.h
echo "EX_USAGE: invalid argument: $1" > /dev/stderr
exit 64
# using errno.h
echo "ENOENT: File not found: $file" > /dev/stderr
exit 2
решение3
Вы можете использовать любое число от 0 до 255, за исключениемзарезервированные коды выхода(Нажмите здесь, чтобы узнать больше)