Виходячи з отриманих відповідей (важко було вибрати одну над іншими), не шкідливо вказувати певні типи помилок, використовуючи код виходу, який також використовує Bash. Bash (або будь-яка інша оболонка Unix) не зробить нічого особливого (наприклад, запущені обробники винятків), якщо сценарій користувача завершиться одним із цих кодів помилок.
Схоже, автор розширеного посібника з сценаріїв Bash погоджується з спробами BSD стандартизувати вихідні коди ( sysexits.h
) і просто рекомендує , коли користувачі пишуть сценарії оболонок, вони не вказують коди виходу, які суперечать попередньо визначеним кодам виходу у використанні, тобто вони обмежують свої власні коди виходу до 50 доступних кодів статусу в діапазоні 64-113.
Я ціную цю ідею (і обґрунтування), але я вважав за краще, якщо автор буде більш чітким, що ігнорувати пораду не шкідливо - окрім випадків, коли споживач сценарію перевіряє на наявність помилок, таких як цитований приклад 127 (command not found
).
Відповідні специфікації POSIX
Я дослідив, що POSIX має сказати про вихідні коди, а специфікація POSIX, схоже, узгоджується з автором Посібника з розширеного сценарію Bash. Я цитував відповідні специфікації POSIX (міна акценту):
Вихід із стану команд
Кожна команда має статус виходу, який може впливати на поведінку інших команд оболонки. Стан виходу команд, які не є утилітами, задокументований у цьому розділі. Статус виходу стандартних утиліт задокументований у відповідних розділах.
Якщо команда не знайдена, стан виходу має бути 127. Якщо ім'я команди знайдено, але це не виконувана утиліта, статус виходу має бути 126. Програми, які викликають утиліти без використання оболонки, повинні використовувати ці значення стану виходу повідомляти про подібні помилки.
Якщо команда не працює під час розширення або перенаправлення слова, його вихідний статус повинен бути більшим за нуль.
Внутрішньо, для вирішення того, чи закінчується команда з ненульовим статусом виходу, оболонка повинна розпізнавати все значення статусу, отримане для команди, еквівалентним макросом WEXITSTATUS функції wait (), як визначено в обсязі системних інтерфейсів POSIX.1-2008). Повідомляючи про стан виходу зі спеціальним параметром "?", Оболонка повинна повідомляти про всі вісім бітів стану виходу. Про стан виходу команди, яка припинилась через отримання сигналу, повідомляється як 128.
exit
утиліти
Як пояснено в інших розділах, певні значення статусу виходу зарезервовані для спеціального використання і повинні використовуватися програмами лише для цих цілей:
126
- Файл, який потрібно виконати, був знайдений, але це не була програма, що виконується.
127
- Утиліта, яку потрібно виконати, не знайдено.
>128
- Команда була перервана сигналом.
Додаткова інформація
Наскільки це варте, я зміг перевірити всі, крім одного зі списку кодів виходу із спеціальними значеннями . Ця таблиця кодів виходів корисна, оскільки містить більше деталей - та приклади того, як генерувати коди помилок, задокументовані у посиланні Баша .
Спроба створити статус виходу 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)
функція просто перетворила float в int (3 у цьому випадку) перед виходом:
#include <stdlib.h>
main()
{
exit(3.14159);
}