Код возврата


Код возврата

Код возврата (exit status) — число, которым программа сообщает, удачно ли завершилось исполнение.

По соглашению, 0 означает, что всё прошло хорошо; любое другое — что нет. У остальных чисел смысл разный для разных программ.


Пример для программы под названием ls:

В ls(1) про возможные коды возврата команды ls сказано следующее:

КодОписание
0if OK,
1if minor problems (e.g., cannot access subdirectory),
2if 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 true; then echo OK; else echo FAIL; fi
## вывод
OK

Как обрабатывать код возврата

В целом, && и || позволяют выразить что-то очень похожее на if, например:

python -c  'exit(0)' && echo Success || echo Failure
## вывод
Success

или, например, так

python -c  'exit(1)' && echo Success || echo Failure
## вывод
Failure

Как здесь расставляются скобки? А можно ли поставить скобки и что будет, если их поставить? Какая ассоциативность?


Код возврата в языках программирования

Пример программы, которая возвращает случайное целое число от 0 до 9 в качестве кода возврата.

C, C++:

include <stdlib.h>
include <time.h>
int main ()
{
  srand(time(NULL));
  return rand() % 10; // <---
}

Код возврата в языках программирования

Пример программы, которая возвращает случайное целое число от 0 до 9 в качестве кода возврата.

Python:

import random
exit(random.randint(0, 9)) # <----