Dans une première approximation, 0 est un succès, non nul est un échec, 1 étant un échec général et tout ce qui est supérieur à un étant un échec spécifique. Mis à part les exceptions triviales de faux et de test, qui sont toutes deux conçues pour donner 1 pour succès, il y a quelques autres exceptions que j'ai trouvées.
Plus réaliste, 0 signifie succès ou peut-être échec, 1 signifie échec général ou peut-être succès, 2 signifie échec général si 1 et 0 sont tous deux utilisés pour réussir, mais peut-être aussi.
La commande diff donne 0 si les fichiers comparés sont identiques, 1 s'ils diffèrent et 2 si les binaires sont différents. 2 signifie également l'échec. La commande less donne 1 pour échec, sauf si vous ne fournissez pas d'argument, auquel cas, elle quitte 0 malgré l'échec.
La commande more et la commande spell donnent 1 pour échec, sauf si l'échec est le résultat d'une autorisation refusée, d'un fichier inexistant ou d'une tentative de lecture d'un répertoire. Dans tous ces cas, ils quittent 0 malgré l'échec.
Ensuite, la commande expr donne 1 pour succès sauf si la sortie est la chaîne vide ou zéro, auquel cas, 0 est réussi. 2 et 3 sont un échec.
Ensuite, il y a des cas où le succès ou l'échec est ambigu. Lorsque grep ne parvient pas à trouver un modèle, il quitte 1, mais il quitte 2 pour un véritable échec (comme une autorisation refusée). Klist quitte également 1 lorsqu'il ne parvient pas à trouver un ticket, bien que ce ne soit pas plus un échec que lorsque grep ne trouve pas de modèle, ou lorsque vous ls un répertoire vide.
Donc, malheureusement, les pouvoirs Unix ne semblent imposer aucun ensemble logique de règles, même sur les exécutables très couramment utilisés.