Ada dua masalah terkait di sini.
Pertama, pertanyaan OP, Mengapa 0 benar tetapi salah adalah 1 di shell? dan yang kedua, mengapa aplikasi mengembalikan 0 untuk sukses dan bukan nol untuk kegagalan?
Untuk menjawab pertanyaan OP kita perlu memahami pertanyaan kedua. Berbagai jawaban untuk posting ini telah menjelaskan bahwa ini adalah konvensi dan telah mencantumkan beberapa kebaikan yang diberikan konvensi ini. Beberapa dari kebaikan ini dirangkum di bawah ini.
Mengapa aplikasi mengembalikan 0 untuk sukses dan bukan nol untuk kegagalan?
Kode yang memanggil operasi perlu mengetahui dua hal tentang status keluar dari operasi. Apakah operasi berhasil keluar? [* 1] Dan jika operasi tidak berhasil keluar, mengapa operasi tersebut tidak berhasil keluar? Nilai apa pun dapat digunakan untuk menunjukkan kesuksesan. Tetapi 0 lebih nyaman daripada angka lain karena portabel antar platform. Meringkas jawaban Xibo untuk ini pertanyaan pada 16 Agustus 2011:
Zero tidak bergantung pada pengkodean.
Jika kita ingin menyimpan satu (1) dalam kata integer 32-bit, pertanyaan pertama adalah "kata big-endian atau kata little-endian?", Diikuti dengan "berapa lama byte menyusun kata little-endian? ", sedangkan nol akan selalu terlihat sama.
Juga perlu diharapkan bahwa beberapa orang melemparkan errno ke char atau short di beberapa titik, atau bahkan melayang. (int) ((char) ENOLCK) bukan ENOLCK jika char tidak setidaknya sepanjang 8-bit (mesin char ASCII 7-bit didukung oleh UNIX), sedangkan (int) ((char) 0) adalah 0 independen dari detail arsitektur char.
Setelah ditentukan bahwa 0 akan menjadi nilai kembali untuk sukses, maka masuk akal untuk menggunakan nilai bukan nol untuk kegagalan. Ini memungkinkan banyak kode keluar untuk menjawab pertanyaan mengapa operasi gagal.
Mengapa 0 benar tetapi salah adalah 1 di shell?
Salah satu kegunaan dasar shell adalah mengotomatiskan proses dengan membuat skrip. Biasanya ini berarti meminta operasi dan kemudian melakukan sesuatu yang lain secara bersyarat berdasarkan status keluar dari operasi tersebut. Philippe A. menjelaskan dengan baik dalam jawaban postingannya ini bahwa
Dalam bash dan shell unix secara umum, nilai yang dikembalikan bukanlah boolean. Mereka adalah kode keluar integer.
Maka perlu untuk menafsirkan status keluar dari operasi ini sebagai nilai boolean. Masuk akal untuk memetakan 0
status keluar yang berhasil ( ) ke benar dan status keluar yang bukan nol / gagal ke salah. Melakukan ini memungkinkan eksekusi bersyarat dari perintah shell yang dirantai.
Berikut ini contohnya mkdir deleteme && cd $_ && pwd
. Karena shell mengartikan 0 sebagai benar, perintah ini bekerja dengan nyaman seperti yang diharapkan. Jika shell menafsirkan 0 sebagai salah maka Anda harus membalikkan status keluar yang ditafsirkan untuk setiap operasi.
Singkatnya, tidak masuk akal bagi shell untuk menafsirkan 0 sebagai salah mengingat konvensi bahwa aplikasi mengembalikan 0 untuk status keluar yang berhasil.
[* 1]: Ya, berkali-kali operasi perlu menghasilkan lebih dari sekadar pesan sukses sederhana tetapi itu berada di luar cakupan utas ini.
Lihat juga Lampiran E dalam Panduan Pembuatan Skrip Bash Lanjutan