Тут є два суміжні питання.
По-перше, питання ОП: Чому 0 відповідає дійсності, але неправда - 1 в оболонці? по-друге, чому додатки повертають 0 за успіх, а не нуль - для відмови?
Щоб відповісти на питання ОП, нам потрібно зрозуміти друге питання. Численні відповіді на цю публікацію описали, що це конвенція, і перерахували деякі приємності, які ця конвенція надає. Деякі з цих смаків наведені нижче.
Чому програми повертають 0 за успіх, а нульове - за помилку?
Код, який викликає операцію, повинен знати дві речі про стан виходу з операції. Чи завершилася операція успішно? [* 1] І якщо операція не закінчується успішно, чому операція завершилася невдало? Будь-яке значення може бути використане для позначення успіху. Але 0 зручніше, ніж будь-яке інше число, оскільки воно переноситься між платформами. Підсумовуючи відповідь xibo на це запитання 16 серпня 2011 року:
Нуль не кодує.
Якби ми хотіли зберегти одне (1) у 32-бітному цілому слові, першим питанням було б «слово великого ендіану чи мало-ендіанське слово?», А далі «як довго байти складають слово мало-ендіанців? ", а нуль завжди буде виглядати однаково.
Крім того, слід очікувати, що деякі люди кидають errno на char або короткий в якийсь момент, або навіть плавати. (int) ((char) ENOLCK) не є ENOLCK, коли char не менше 8-бітової довжини (7-бітні машини ASCII char підтримуються UNIX), тоді як (int) ((char) 0) 0 не залежить від архітектурні деталі char.
Як тільки буде визначено, що 0 буде повернутим значенням для успіху, тоді має сенс використовувати будь-яке ненульове значення для відмови. Це дозволяє багатьом вихідним кодам відповісти на питання, чому операція не вдалася.
Чому 0 відповідає дійсності, але неправда - 1 в оболонці?
Одне з основних принципів використання снарядів - автоматизація процесів шляхом їх написання. Зазвичай це означає викликати операцію, а потім робити щось інше, умовно на основі статусу виходу з операції. Філіп А. чудово пояснив у своїй відповіді на цю посаду, що
У bash і в оболонках Unix взагалі значення повернення не булеві. Вони є цілими кодами виходу.
Тоді необхідно інтерпретувати статус виходу цих операцій як булеве значення. Має сенс зіставити успішний ( 0
) статус виходу на істинний, а будь-який ненульовий / вихідний вихідний - на помилковий. Це дозволяє умовно виконувати ланцюгові команди оболонки.
Ось приклад mkdir deleteme && cd $_ && pwd
. Оскільки оболонка інтерпретує 0 як справжню, ця команда зручно працює, як очікувалося. Якщо оболонка повинна інтерпретувати 0 як помилкову, вам доведеться інвертувати інтерпретований статус виходу для кожної операції.
Коротше кажучи, було б безглуздо для оболонки інтерпретувати 0 як хибну, враховуючи умову, що програми повертають 0 за успішний статус виходу.
[* 1]: Так, багато разів операції потребують повернення більше, ніж просто повідомлення про успіх, але це виходить за межі цього потоку.
Дивіться також Додаток E у Додатковому посібнику з написання сценарію