Burada birbiriyle ilişkili iki konu var.
İlk olarak, OP'nin sorusu, neden 0 doğru ama yanlış 1'dir? ve ikincisi, uygulamalar neden başarı için 0 ve başarısızlık için sıfır olmayan döndürür?
OP'nin sorusunu cevaplamak için ikinci soruyu anlamamız gerekir. Bu gönderiye verilen sayısız cevap, bunun bir sözleşme olduğunu açıkladı ve bu sözleşmenin sağladığı bazı güzellikleri listeledi. Bu niteliklerden bazıları aşağıda özetlenmiştir.
Uygulamalar neden başarı için 0, başarısızlık için sıfır olmayan döndürür?
Bir işlemi çağıran kodun, işlemin çıkış durumu hakkında iki şeyi bilmesi gerekir. İşlem başarıyla çıktı mı? [* 1] Ve eğer işlem başarılı bir şekilde çıkmazsa, neden işlem başarısız bir şekilde çıktı? Başarıyı belirtmek için herhangi bir değer kullanılabilir. Ancak 0, platformlar arasında taşınabilir olduğu için diğer numaralardan daha kullanışlıdır. Xibo'nun 16 Ağustos 2011'de bu soruya verdiği cevabı özetlersek :
Sıfır, kodlamadan bağımsızdır.
32 bitlik tamsayı bir kelimede bir (1) saklamak istersek, ilk soru "büyük endian kelimesi veya küçük-endian kelimesi?" Ve ardından "küçük endian kelimesini oluşturan baytlar ne kadar uzun?" Olacaktır. ", sıfır ise hep aynı görünecektir.
Ayrıca, bazı insanların bir noktada errno'yu char veya short atmaları, hatta float yapmaları beklenmelidir. (int) ((char) ENOLCK), char en az 8 bit uzunluğunda olmadığında ENOLCK değildir (7 bit ASCII karakterli makineler UNIX tarafından desteklenir), (int) ((char) 0) ise 0'dan bağımsızdır. charın mimari detayları.
Başarı için 0'ın dönüş değeri olacağı belirlendikten sonra, başarısızlık için sıfır olmayan herhangi bir değer kullanmak mantıklıdır. Bu, birçok çıkış kodunun işlemin neden başarısız olduğu sorusuna yanıt vermesini sağlar .
Neden 0 doğru, ancak kabukta 1 yanlıştır?
Kabukların temel kullanımlarından biri, süreçleri komut dosyası oluşturarak otomatikleştirmektir. Genellikle bu, bir işlemi çağırmak ve ardından işlemin çıkış durumuna bağlı olarak koşullu olarak başka bir şey yapmak anlamına gelir. Philippe A. , bu gönderiye verdiği cevabın
Bash ve unix kabuklarda genel olarak, dönüş değerleri boole değildir. Tamsayı çıkış kodlarıdır.
Bu işlemlerin çıkış durumunu bir boole değeri olarak yorumlamak gerekir. Başarılı ( 0
) bir çıkış durumunu doğru ve sıfır olmayan / başarısız çıkış durumlarını yanlış olarak eşlemek mantıklıdır . Bunu yapmak, zincirleme kabuk komutlarının koşullu yürütülmesine izin verir.
İşte bir örnek mkdir deleteme && cd $_ && pwd
. Kabuk 0'ı doğru olarak yorumladığından, bu komut beklendiği gibi rahatlıkla çalışır. Kabuk, 0'ı yanlış olarak yorumlayacaksa, her işlem için yorumlanan çıkış durumunu tersine çevirmeniz gerekir.
Kısacası, uygulamaların başarılı bir çıkış durumu için 0 döndürdüğü düşünüldüğünde, kabuğun 0'ı yanlış olarak yorumlaması mantıksız olacaktır.
[* 1]: Evet, çoğu zaman işlemlerin basit bir başarı mesajından fazlasını döndürmesi gerekir, ancak bu, bu iş parçacığının kapsamı dışındadır.
Ayrıca Gelişmiş Bash Komut Dosyası Oluşturma Kılavuzundaki Ek E'ye bakın.