Какие значения возврата/выхода можно использовать в функциях/скриптах bash?

Какие значения возврата/выхода можно использовать в функциях/скриптах bash?

Я хочу знать, какие возвращаемые значения мы можем использовать, чтобы не возникло ошибок, например, с 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, за исключениемзарезервированные коды выхода(Нажмите здесь, чтобы узнать больше)

Связанный контент