Код возврата (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, например:

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)) # <----