Ad una prima approssimazione, 0 è successo, diverso da zero è fallimento, con 1 è un errore generale e qualcosa di più grande di uno è un errore specifico. A parte le banali eccezioni di falso e test, che sono entrambe progettate per dare 1 per il successo, ci sono alcune altre eccezioni che ho trovato.
Più realisticamente, 0 significa successo o forse fallimento, 1 significa fallimento generale o forse successo, 2 significa fallimento generale se 1 e 0 sono entrambi usati per il successo, ma forse anche successo.
Il comando diff dà 0 se i file confrontati sono identici, 1 se differiscono e 2 se i binari sono diversi. 2 significa anche fallimento. Il comando less fornisce 1 per errore a meno che non si riesca a fornire un argomento, nel qual caso, esce 0 nonostante non sia riuscito.
Il comando maggiore e il comando ortografico danno 1 per errore, a meno che l'errore non sia il risultato di un'autorizzazione negata, un file inesistente o un tentativo di leggere una directory. In uno di questi casi, escono 0 nonostante non riescano.
Quindi il comando expr fornisce 1 per successo a meno che l'output sia la stringa vuota o zero, nel qual caso 0 è successo. 2 e 3 sono guasti.
Quindi ci sono casi in cui il successo o il fallimento sono ambigui. Quando grep non riesce a trovare un modello, esce 1, ma esce 2 per un vero fallimento (come l'autorizzazione negata). Klist esce anche 1 quando non riesce a trovare un ticket, anche se questo non è in realtà un errore maggiore rispetto a quando grep non trova uno schema o quando si trova una directory vuota.
Quindi, sfortunatamente, i poteri unix che sembrano non imporre alcun insieme logico di regole, anche su eseguibili di uso molto comune.