Код возврата (exit status) — число, которым программа сообщает, удачно ли завершилось исполнение.
По соглашению, 0 означает, что всё прошло хорошо; любое другое — что нет. У остальных чисел смысл разный для разных программ.
Пример для программы под названием ls:
В ls(1) про возможные коды возврата команды ls
сказано следующее:
Код | Описание |
---|---|
0 | if OK, |
1 | if minor problems (e.g., cannot access subdirectory), |
2 | if serious trouble (e.g., cannot access command-line argument). |
т.е. если ls
не сможет получить доступ к директории (например, её не существует), то код возврата будет 1.
Как обрабатывать код возврата
Для начала, давайте научимся выводить код последней программы:
python -c "exit(5)"
echo $?
## вывод
5
Если вы уже знакомы с переменными в shell, то да, $?
— это такая специальная переменная (разыменование ?
), которая содержит код возврата последней исполненной в шелле команды.
Спасибо создателям, вывод кода возврата в консоль — не единственное, что можно сделать с кодом возврата: почти все конструкции shell так или иначе используют код возврата для работы.
Здесь рассмотрены далеко не все конструкции, а только &&
и ||
— с их помощью можно составлять т.н. списки команд, а также if
, который позволяет организовать ветвление.
Оператор | Описание |
---|---|
p1 && p2 | Если команда слева (p1 ) завершилась кодом возврата 0, то исполняем команду справа (p2 ) и возвращаем её код, иначе возвращаем код возврата команды слева (p1 ) |
p1 || p2 | Если команда слева (p1 ) закончилась кодом возврата отличным от 0, то исполняем команду справа (p2 ) и возвращаем её код, иначе возвращаем 0. |
if p1; then p2; else p3; fi | Если команда в условии if (p1 ) завершилась успешно, т.е. с кодом возврата 0, то исполняем команду в основной ветке (p2 ) иначе исполняем код в побочной ветке (p3 ). |
В целом, &&
и ||
позволяют выразить что-то очень похожее на if
, например:
python -c 'exit(0)' && echo Success || echo Failure
## вывод
Success
python -c 'exit(1)' && echo Success || echo Failure
## вывод
Failure
if true; then echo OK; else echo FAIL; fi
## вывод
OK
Как здесь расставляются скобки? А можно ли поставить скобки и что будет, если их поставить? Какая ассоциативность?
Подробнее о конструкциях в shell и списках команд.
Код возврата в языках программирования
Далее приведены примеры программ, которые возвращают случайное целое число от 0 до 9 в качестве кода возврата.
C, C++:
include <stdlib.h>
include <time.h>
int main ()
{
srand(time(NULL));
return rand() % 10; // <---
}
Python:
import random
exit(random.randint(0, 9)) # <----