Temiz çıkış için sıfır olmayan çıkış durumu


15

Söz konusu program düzgün bir şekilde çalıştıysa sıfırdan farklı bir çıkış kodu döndürmek kabul edilebilir mi? Örneğin, (yalnızca) aşağıdakileri yapan basit bir programım olduğunu varsayalım:

Program N argümanı alıyor. Min çıkış kodunu döndürür (N, 255). Herhangi bir N'nin program için geçerli olduğunu unutmayın.

Daha gerçekçi bir program, farklı şeyleri gösteren başarılı bir şekilde çalıştırılan programlar için farklı kodlar döndürebilir. Bu programlar bunun yerine bu bilgileri stdout gibi bir akışa mı yazmalıdır?

Yanıtlar:


24

Çevreye bağlı, ama kötü bir tarz olduğunu söyleyebilirim.

Unix benzeri sistemler, 0 çıkış durumunun başarıyı ve sıfır olmayan çıkış durumlarının başarısızlığı ifade ettiği konusunda güçlü bir kurala sahiptir. Hepsi olmasa da bazı programlar, sıfır olmayan çıkış kodları ile farklı türdeki hataları birbirinden ayırır; örneğin grep, desen bulunursa genellikle 0, bulunmuyorsa 1 ve eksik dosya gibi bir hata varsa 2 (veya daha fazla) döndürür.

Bu konvansiyon Unix mermilerine oldukça sıkı bir şekilde bağlı. Örneğin, sh, bashve diğer Bourne benzeri kabuklar, ifdeyim davranır başarı doğru / gibi 0 çıkış durumu ve başarısızlık / yanlış olarak sıfırdan farklı çıkış durumu:

if your-command
then
    echo ok
else
    echo FAILURE
fi

MS Windows kapsamındaki sözleşmelerin benzer olduğuna inanıyorum.

Şimdi durdurma şey kullandığı alışılmamış çıkış kodları, başka hiçbir şey, onunla etkileşime, ancak bir iyi kurulmuş kongre ihlal ettiğinize dikkat etmek zorundasınız ve özellikle eğer o kendi programını yazmaktan kesinlikle var olabilir sonra geri dönüp sizi ısırmaya .

Bir programın bu tür bilgileri döndürmesinin olağan yolu, programı şu şekilde yazdırmaktır stdout:

status = $(your-command)
echo Result is $status

7
Kongreyi açıklamak için +1, bir yaklaşım koyarsam, kabuk metinlerimin çoğunu set -ekıracaktı.
Benjamin Bannier

Benzer şekilde grep, difffarklılıklar bulunduğunda 1 değerini döndürür; ve> 1 bir hata olursa.
7heo.tk

6

Ortamınızın beklentilerine bağlıdır.

Wierdness için en sevdiğim, Wikipedia'dan :

OpenVMS'de başarı, tek değerlerle ve başarısızlık çift değerlerle gösterilir. Değer, alt alanları olan 32 bitlik bir tamsayıdır: kontrol bitleri, tesis numarası, mesaj numarası ve şiddeti. Önem derecesi değerleri başarı (Başarı, Bilgilendirme) ve başarısızlık (Uyarı, Hata, Ölümcül) arasında bölünür.


4

Çıkış kodu arayan için anlamlı, ilgili bilgi döndürüyor ve başarı tanımı gerçekten ikili değilse bir emsal olduğunu düşünüyorum. Düşündüğüm emsal, olanlara bağlı olarak bir dizi farklı şey döndüren robokopidir .

Bu nedenle her zaman bazı hata ayıklamalara sahip olduğumuzu ekleyeceğim - çoğu yardımcı program çıkış kodu 0 == başarılı olduğunu varsayıyor, bu yüzden robokopi 1 döndürdüğünde çıldırıyorum, çünkü şeyleri kopyalamamıştı ama kopyalamadı çünkü t Bir hata alma.


2

başarılı bir çalışma için 0 döndürmemek kötü bir fikirdir, çünkü programınızı çalıştıranlar için karışıklığa neden olabilir. Bazıları programınızı farklı girdilerle 100'den fazla kez çalıştırdıysa ve kaçının başarılı bir şekilde başarısız olduğunu veya tamamlandığını bilmek isterse, tek bir başarı değerine sahip olmak, farklılıkları birçok farklı değere sahip olmaktan çok daha kolay hale getirir.

Farklı şeyleri ifade edebilecek birden fazla başarılı dönüş yolu olan bir programınız varsa, programınızın kötü tasarlanmış bir işaret olduğunu söyleyebilirim.


2

Kabul edilebilir olduğunu düşündüğüm bir dava biliyorum. Toplam test hatası sayısıyla çıkan bir test çerçevesi biliyorum. Bu nedenle, örneğin, test koşucusu başarısız bir test olmadan tamamlanırsa, sıfırdan çıkar. Bir test başarısız olursa, test koşucusunun kendisi doğru bir şekilde çalışsa bile, bir 1 ile çıkar. İki başarısız olursa 2, vb. Döndürür. Bu 250'ye yükselir, bu da "250 veya daha fazla test hatası" anlamına gelir.

Anormal çıkışları belirtmek için 250'den fazla çıkış kodu kullanır.

Bu sözleşmeyi ihlal etse de, pratikte iyi çalışır.


3
Bunu düşünmüyorum yapar kongre ihlal - Hata varsa test başarılıdır; sıfır dışında herhangi bir sonuç kodu başarısız testlere işaret eder.
Bevan

1
Bu, "0'dan fazla hatayı belirtmek için bir hata durumundan çıkmaktır" ve çıkış durumunun tam anlamsal anlamlarını ihlal etse de, kesinlikle daha büyük olan "0 tamam, 0'dan büyük bir şey bir hatadır" kuralını ihlal etmez. .
Vatine

2

Bu gerçekten kodla ne aktarmaya çalıştığınıza bağlıdır. DB2, örneğin, veri bulunmazsa 100, uyarılar için çeşitli diğer pozitif değerler ve hatalar için negatif değerler döndürür. Oracle benzer bir şey yapar.

Dolayısıyla, farklı başarı durumları varsa, değişen dönüş değerleri kullanmaya değer olabilir.


2

İyi bir örnek: man sa-update (spamassassin)

ÇIKIŞ KODLARI

  • 0 çıkış kodu, bir güncellemenin mevcut olduğu ve --checkonly belirtilmemişse başarıyla indirilip yüklendiği anlamına gelir.
  • 1 çıkış kodu, yeni güncelleme bulunmadığı anlamına gelir.
  • 2 çıkış kodu ...

Bu durumda, çıkış 1 basitçe bilgilendirici bir koddur. Ancak, kod yazmış olsaydım, ben genellikle şebeke hatası beri 1 seçmezdim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.