Para una primera aproximación, 0 es éxito, no cero es falla, siendo 1 una falla general y cualquier cosa mayor que uno es una falla específica. Aparte de las excepciones triviales de falso y prueba, que están diseñadas para dar 1 por éxito, encontré algunas otras excepciones.
De manera más realista, 0 significa éxito o tal vez falla, 1 significa falla general o tal vez éxito, 2 significa falla general si 1 y 0 se usan para el éxito, pero tal vez también el éxito.
El comando diff proporciona 0 si los archivos comparados son idénticos, 1 si difieren y 2 si los binarios son diferentes. 2 también significa fracaso. El comando less da 1 por falla a menos que no proporcione un argumento, en cuyo caso, sale de 0 a pesar de fallar.
El comando more y el comando de deletreo dan 1 por falla, a menos que la falla sea el resultado de un permiso denegado, un archivo inexistente o un intento de leer un directorio. En cualquiera de estos casos, salen de 0 a pesar de fallar.
Luego, el comando expr da 1 para el éxito a menos que la salida sea la cadena vacía o cero, en cuyo caso, 0 es el éxito. 2 y 3 son fracaso.
Luego hay casos en los que el éxito o el fracaso son ambiguos. Cuando grep no puede encontrar un patrón, sale 1, pero sale 2 por una falla genuina (como permiso denegado). Klist también sale 1 cuando no puede encontrar un ticket, aunque esto no es realmente un error mayor que cuando grep no encuentra un patrón o cuando es un directorio vacío.
Entonces, desafortunadamente, los poderes de Unix que parecen no imponen ningún conjunto lógico de reglas, incluso en ejecutables muy comúnmente utilizados.