Здесь есть две связанные проблемы.
Во-первых, вопрос OP: почему 0 истинно, а ложь 1 в оболочке? и второй: почему приложения возвращают 0 в случае успеха и ненулевое значение в случае неудачи?
Чтобы ответить на вопрос ОП, нам нужно понять второй вопрос. В многочисленных ответах на этот пост говорится, что это соглашение, и перечислены некоторые из нюансов, которые оно предоставляет. Некоторые из этих тонкостей кратко описаны ниже.
Почему приложения возвращают 0 в случае успеха и ненулевое значение в случае неудачи?
Код, который вызывает операцию, должен знать две вещи о статусе завершения операции. Операция завершилась успешно? [* 1] А если операция не завершилась успешно, почему операция завершилась неудачно? Для обозначения успеха можно использовать любое значение. Но 0 удобнее любого другого числа, потому что он переносится между платформами. Обобщая ответ xibo на этот вопрос 16 августа 2011 года:
Ноль не зависит от кодировки.
Если бы мы хотели сохранить единицу (1) в 32-битном целочисленном слове, первым вопросом было бы «слово с прямым порядком байтов или слово с прямым порядком байтов?», За которым следовало бы «какова длина байтов, составляющих слово с прямым порядком байтов?». ", а ноль всегда будет выглядеть одинаково.
Также следует ожидать, что в какой-то момент некоторые люди приведут errno к char, short или даже к float. (int) ((char) ENOLCK) не является ENOLCK, если длина char не превышает 8 бит (машины с 7-битными символами ASCII поддерживаются UNIX), а (int) ((char) 0) равно 0 независимо от архитектурные детали чар.
Как только будет определено, что 0 будет возвращаемым значением для успеха, тогда имеет смысл использовать любое ненулевое значение для неудачи. Это позволяет множеству кодов выхода ответить на вопрос, почему операция не удалась.
Почему 0 истинно, а ложь 1 в оболочке?
Одно из основных применений оболочек - автоматизация процессов путем их написания сценариев. Обычно это означает вызов операции, а затем выполнение чего-то еще, условно в зависимости от статуса завершения операции. Филипп А. хорошо объяснил в своем ответе на этот пост, что
В bash и в оболочках unix в целом возвращаемые значения не являются логическими. Это целые коды выхода.
Затем необходимо интерпретировать статус завершения этих операций как логическое значение. Имеет смысл сопоставить 0
статус выхода успешный ( ) с истиной, а любой ненулевой / неудачный статус выхода - с ложью. Это позволяет условно выполнять связанные команды оболочки.
Вот пример mkdir deleteme && cd $_ && pwd
. Поскольку оболочка интерпретирует 0 как истину, эта команда работает должным образом. Если бы оболочка интерпретировала 0 как ложь, вам пришлось бы инвертировать интерпретируемый статус выхода для каждой операции.
Короче говоря, для оболочки было бы бессмысленно интерпретировать 0 как ложь, учитывая соглашение, согласно которому приложения возвращают 0 при успешном статусе выхода.
[* 1]: Да, во многих случаях операции должны возвращать нечто большее, чем просто сообщение об успешном выполнении, но это выходит за рамки этой темы.
См. Также Приложение E в Advanced Bash-Scripting Guide