Thank you for reading this post, don't forget to subscribe!
Каждый скрипт, команда или двоичный файл завершается с кодом возврата.
Вы можете увидеть это значение в специальной переменной $?.
Коды возврата являются числовыми и ограничиваются значением от 0 до 255, поскольку используется 8-разрядное целое число без знака.
Если вы используете значение -1, он вернет 255.
Каждое выполнение завершается кодом завершения, удачным или нет, с сообщением об ошибке или без вывода сообщений.
Например:
1 2 3 |
$ date ; echo $? Sat Jan 18 08:06:07 IST 2020 0 |
1 2 3 |
$ wrngcmd ; echo $? -bash: wrngcmd: command not found 127 |
Зарезервированные экзит коды 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
|
1 2 3 4 |
#!/bin/bash while true; do echo ${$} done |
1 2 3 4 5 6 7 8 9 10 11 |
# sh test.sh .... 2582 2582 2582 2582 2582 2582 ^C geeklab$ echo $? 130 |
1 2 3 4 5 6 |
# sh test.sh .... 2582 2582 2582 ... |
1 |
# kill -9 [pid_of_script] |
1 2 3 4 5 6 |
.... 2602 2602 Killed: 9 geeklab$ echo $? 137 |