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