Są tu dwa powiązane problemy.
Po pierwsze, pytanie OP: Dlaczego 0 jest prawdą, a fałsz to 1 w powłoce? a po drugie, dlaczego aplikacje zwracają 0 dla sukcesu i niezerowe dla niepowodzenia?
Aby odpowiedzieć na pytanie PO, musimy zrozumieć drugie pytanie. W licznych odpowiedziach na ten post opisano, że jest to konwencja, i wymieniono niektóre niuanse, które zapewnia ta konwencja. Poniżej podsumowano niektóre z tych subtelności.
Dlaczego aplikacje zwracają 0 w przypadku sukcesu i niezerowe w przypadku niepowodzenia?
Kod, który wywołuje operację, musi wiedzieć dwie rzeczy o statusie zakończenia operacji. Czy operacja zakończyła się pomyślnie? [* 1] A jeśli operacja nie zakończyła się pomyślnie, dlaczego operacja zakończyła się niepowodzeniem? Do określenia sukcesu można użyć dowolnej wartości. Ale 0 jest wygodniejszy niż jakakolwiek inna liczba, ponieważ można go przenosić między platformami. Podsumowując odpowiedź xibo na to pytanie z dnia 16 sierpnia 2011 r .:
Zero jest niezależne od kodowania.
Gdybyśmy chcieli zapisać jeden (1) w 32-bitowym słowie całkowitym, pierwsze pytanie brzmiałoby: „Big-endian word or little-endian word?”, A następnie „jak długie są bajty tworzące słowo little-endian? ”, podczas gdy zero zawsze będzie wyglądać tak samo.
Należy się również spodziewać, że niektórzy ludzie rzucają w pewnym momencie errno do zwęglenia lub zwarcia, a nawet do unoszenia się. (int) ((char) ENOLCK) nie jest ENOLCK, gdy znak nie jest co najmniej 8-bitowy (7-bitowe maszyny ASCII char są obsługiwane przez UNIX), podczas gdy (int) ((char) 0) jest 0 niezależne od detale architektoniczne char.
Po ustaleniu, że wartość 0 będzie zwracaną wartością sukcesu, sensowne jest użycie dowolnej wartości niezerowej dla niepowodzenia. Dzięki temu wiele kodów zakończenia pozwala odpowiedzieć na pytanie, dlaczego operacja się nie powiodła.
Dlaczego 0 jest prawdą, a fałszem 1 w powłoce?
Jednym z podstawowych zastosowań powłok jest automatyzacja procesów poprzez ich skrypty. Zwykle oznacza to wywołanie operacji, a następnie wykonanie innej czynności warunkowo na podstawie statusu zakończenia operacji. Philippe A. ładnie to wyjaśnił w swojej odpowiedzi na ten post
W bashu i ogólnie w powłokach unixowych wartości zwracane nie są logiczne. Są to całkowite kody wyjścia.
Konieczne jest zatem zinterpretowanie statusu zakończenia tych operacji jako wartości logicznej. Sensowne jest mapowanie 0
statusu zakończenia pomyślnego ( ) na wartość true, a statusu wyjścia niezerowego / błędu na fałsz. Dzięki temu możliwe jest warunkowe wykonywanie połączonych poleceń powłoki.
Oto przykład mkdir deleteme && cd $_ && pwd
. Ponieważ powłoka interpretuje 0 jako prawdziwe, polecenie to działa zgodnie z oczekiwaniami. Gdyby powłoka zinterpretowała 0 jako fałsz, należałoby odwrócić zinterpretowany kod zakończenia dla każdej operacji.
Krótko mówiąc, interpretacja wartości 0 jako fałszu przez powłokę byłaby bezsensowna, biorąc pod uwagę konwencję, zgodnie z którą aplikacje zwracają 0 dla pomyślnego zakończenia.
[* 1]: Tak, wiele razy operacje muszą zwracać coś więcej niż zwykły komunikat o sukcesie, ale to wykracza poza zakres tego wątku.
Zobacz także Dodatek E w Przewodniku po zaawansowanych skryptach Bash