коды выхода Bash

Thank you for reading this post, don't forget to subscribe!

Каж­дый скрипт, коман­да или дво­ич­ный файл завер­ша­ет­ся с кодом возврата.

Вы може­те уви­деть это зна­че­ние в спе­ци­аль­ной переменной $?.

Коды воз­вра­та явля­ют­ся чис­ло­вы­ми и огра­ни­чи­ва­ют­ся зна­че­ни­ем от 0 до 255, посколь­ку исполь­зу­ет­ся 8-раз­ряд­ное целое чис­ло без знака.

Если вы исполь­зу­е­те зна­че­ние -1, он вер­нет 255.

Каж­дое выпол­не­ние завер­ша­ет­ся кодом завер­ше­ния, удач­ным или нет, с сооб­ще­ни­ем об ошиб­ке или без выво­да сообщений.

Напри­мер:

Как види­те, код выхо­да равен 0, пото­му что коман­да была выпол­не­на без проблем.
Теперь давай­те попро­бу­ем это:
Эта коман­да не най­де­на, посколь­ку мы про­сто набра­ли бес­смыс­лен­ную груп­пу сим­во­лов.

Зарезервированные экзит коды Bash

Подоб­но коду выхо­да «0», кото­рый обо­зна­ча­ет успех коман­ды, bash име­ет несколь­ко заре­зер­ви­ро­ван­ных кодов выхо­да для раз­лич­ных ситуаций.

Поэто­му в иде­а­ле, если вы исполь­зу­е­те коман­ду выхо­да в скрип­те и вам нуж­но ука­зать код выхо­да, не исполь­зуй­те эти заре­зер­ви­ро­ван­ные коды выхо­да, так как они могут при­ве­сти к про­ти­во­ре­чи­вым результатам.

Код выхо­да
Смысл При­мер Ком­мен­та­рий
1 Catchall для общих ошибок let “var1 = 1/0”
Раз­ные ошиб­ки, такие как «деле­ние на ноль» и дру­гие недо­пу­сти­мые операции
2
Зло­упо­треб­ле­ние встро­ен­ны­ми оболочками
empty_function() {}
Отсут­ству­ет клю­че­вое сло­во или команда
126
Вызван­ная коман­да не может быть выполнена
/dev/null
Про­бле­ма с пра­ва­ми или коман­да не явля­ет­ся исполняемым
127 “command not found” illegal_command Воз­мож­ная про­бле­ма с $PATH или опечаткой
128 Невер­ный аргу­мент для выхода exit 3.14159
exit при­ни­ма­ет толь­ко цело­чис­лен­ные аргу­мен­ты в диа­па­зоне 0 — 255 (см. первую сноску)
128 +n
Сиг­нал фаталь­ной ошиб­ки «n»
kill -9 $PPID
$? воз­вра­ща­ет 137 (128 + 9)
130
Скрипт пре­кра­щен с помо­щью Control-C
Ctrl-C
Control-C — это сиг­нал 2 фаталь­ной ошиб­ки (130 = 128 + 2, см. Выше)
255*
Выход из состо­я­ния вне диапазона
exit -1
выход при­ни­ма­ет толь­ко цело­чис­лен­ные аргу­мен­ты в диа­па­зоне 0 — 255
Давай­те раз­бе­рем код выхо­да «128 + n» на примере.
Запу­сти­те бес­ко­неч­ный цикл, как пока­за­но ниже:
Если вы запу­сти­те этот скрипт, он будет выо­дить один и тот же PID до тех пор, пока вы не убье­те его или не нажме­те «CTRL + C».
Давай­те попро­бу­ем сде­лать «CTRL + C» и посмот­реть, какой код выхода.
Как види­те, код выхо­да — «128 + 2», т. е 130.
Точно так же, если мы уни­что­жа­ем скрипт с помо­щью «kill -9», код выхо­да дол­жен быть «128 + 9», т. е. 137.
Давай­те посмот­рим пример: