Мне нужно немного поспорить с ответом Йоханнеса. Истинный 0 используется для успеха, потому что есть только 1 успешный результат, в то время как может быть много неудачных результатов. Но мой опыт показывает, что коды возврата имеют меньшее отношение к причинам для сбоя, чем уровням сбоя.
Еще во времена пакетного программирования обычно существовали соглашения для кодов возврата, которые позволяли автоматизировать весь поток выполнения. Таким образом, код возврата 4 может быть предупреждением, но следующая работа может продолжаться; 8 может означать, что поток работ должен остановиться; 12 может означать, что произошло что-то катастрофическое, и пожарная служба должна быть уведомлена.
Аналогичным образом, пакеты будут выделять некоторый диапазон кодов возврата, чтобы общий поток пакетов мог переходить. Например, если программа обновления вернула XX, пакет может пропустить шаг резервного копирования, поскольку ничего не изменилось.
Коды возврата как причины сбоя не так уж полезны, конечно, не так много, как файлы журналов, дампы ядра, предупреждения консоли и тому подобное. Я никогда не видел систему, которая возвращает XX, потому что "такой-то и такой-то файл не найден", например.