Завершение выполнения любой программы в ОС UNIX сопровождается выработкой некоторого значения кода завершения, который возвращается родительскому процессу. По коду завершения вызывающий процесс определяет, как завершилось выполнение команды – успешно или нет. Команды UNIX возвращают код 0 при положительном исходе и код, отличный от 0 (1, 2 и т.д.), если что-то было выполнено неправильно.
По принятому соглашению число, равное нулю, обозначается true (успешное выполнение), а число, отличное от нуля, обозначается false (неуспешное завершение). False может иметь несколько значений, и конкретное значение часто указывает причину, по которой процесс завершился неуспешно. Некоторые команды, например, grep и diff, для каждой ошибки выдают особый ненулевой код (конкретные значения приведены в документации).
Для установления требуемого кода завершения интерпретатор shell имеет две специальные программы – true и false, единственная функция которых состоит в формировании значений кода true – нуля и false – единицы.
Интерпретатор помещает код завершения предыдущей команды в переменную ?. Ее значение можно получить, поставив перед именем знак доллара, как и в случае любой другой переменной.
Например, чтобы получить код завершения команд true и false, можно использовать присвоение переменным A и B кода их завершения:
$ true;A=$?
$ false;B=$?
$ echo $A $B
0 1
Как правило, код завершения не нужно выводить на экран. Существует несколько способов использования кода завершения одной команды, как условие выполнения следующей, которые будут рассмотрены в следующих главах.