Komut satırı uygulamasında standart hata akışı ne zaman kullanılır?


9

Komut satırı uygulaması yazarken hatanın ne zaman kullanılacağına dair bir kılavuz var mı? Sürprizime göre, googling yaparken hiçbir şey bulamadım.

Özellikle, şu anda ilgilenen kulüpler soru kullanımına olup olmadığıdır stdoutveya stderrkullanıcı yasadışı argümanları ile programı çağrıldığında. Bununla birlikte, daha kapsamlı bir cevap çok takdir edilmektedir, çünkü bu, kullanıcı tarafından beklenen şekilde davranan bir program yazmak için açık bir kuralın gerekli olduğu tek durum olmayacaktır.


Bu hata mesajlarının normal çıktıya karışması uygun mudur? Program veri için bir filtre midir?
17'de

Veriler için bir filtre değildir. Ayrıca etkileşimli de değil. Kullanıcı argümanlarla (aralarında dosya yolları vardır) çağırır, programlar çalışır, bu dosyaları değiştirir, birkaç mesaj yazdırır, ideal olarak herhangi bir hata mesajı yazdırmaz ve sonlandırır.
UTF-8

Yanıtlar:


15

Evet, stderryanlış bağımsız değişkenler kullanıldığında bir mesaj görüntüleyin . Bu da uygulamanın çıkmasına neden oluyorsa, sıfır olmayan çıkış durumuyla çıkın.

Tanılama iletileri veya kullanıcı etkileşimi için standart hata akışını kullanmalısınız . Teşhis mesajları, doğru çalıştığında yardımcı programın çıkışının bir parçası olmayan hata mesajlarını, uyarıları ve diğer mesajları içerir ("doğru", yani dosyalar bulunamaması veya ne olursa olsun istisnai bir şey olmadığı anlamına gelir).

Birçok kabuk (tümü?) stderr, Yönlendirmeleri stdout, kabukla anlamlı bir şekilde etkileşime girmenizi engellemeyecek şekilde istemleri, kullanıcı türlerini ve menüleri vb . Görüntüler.

Bu konuyla ilgili bir blog yayınından aşağıdakiler :

Bu, Unix borularının mucidi Doug McIllroy'un nasıl olduğunu açıklayan bir alıntı stderr. 'v6', orijinal Unix işletim sisteminin 1975'te piyasaya sürülen belirli bir sürümüne atıfta bulunuyor.

Tüm programlar standart çıktıya teşhis koydu. Bu, çıktı bir dosyaya yönlendirildiğinde her zaman soruna neden olmuştu, ancak çıktı şüpheli olmayan bir sürece gönderildiğinde dayanılmaz hale geldi. Bununla birlikte, standart-girdi-standart-çıktı modelinin basitliğini ihlal etmek istemeyen insanlar, v6 aracılığıyla bu durumu tolere ettiler. Kısa süre sonra Dennis Ritchie, standart hata dosyasını tanıtarak Gordian düğümünü kesti. Bu yeterli değildi. Boru hatları ile tanılama, aynı anda çalışan birkaç programdan herhangi birinden gelebilir. Kendilerini tanımlamak için teşhis gerekli.
- Doug McIllroy, "Bir Araştırma UNIX Okuyucu: Programcı El Kitabından Ek Açıklamalar, 1971-1986"

"Kendini tanımlamak" demek, basitçe "Hey! Konuşuyorum! Bu yanlış gitti: [...]":

$ ls nothere
ls: nothere: No such file or directory

Bunu yapmak stderrtercih edilir, çünkü aksi halde ne okuyorsa okunabilir stdout(ama bunu lsyine de yapmıyoruz, değil mi?).


Yani kullanıcıya uygulama çalışırken bir şey sorduğunuzda, soruyu stderr? Kulağa doğru gelmiyor. Bunun için bir kaynağın var mı? Bu yalnızca, yalnızca sorular ve yanıtlar (kullanıcının bir yere yöneltmek isteyebileceği çıktı) dışında çıktısı olan uygulamalar için mi geçerlidir?
UTF-8

@ UTF-8 Soru metni programın çıktısının bir parçası olarak düşünülmeli mi? Kullanıcının yazdığı şey ne olacak? Olması gerektiğini düşünmüyorum (mermilerin olması gerektiğini düşünmemesi gibi). Ama belki de uygulamaya bağlıdır?
Kusalananda

1
Düzenlemeniz için teşekkür ederim. Bu arada, standart uygulamaların davranışını kontrol ettim ve yanıtınızı okuduktan sonra onların davranışlarını bekler gibi davranıyorlar.
UTF-8

@ UTF-8 bu soru ve cevapları
terdon

6

Gönderen POSIX özelliklerine standart akışları için:

Program başlangıcında, üç akış önceden tanımlanmalı ve açıkça açılmasına gerek yoktur: standart girdi (geleneksel girdiyi okumak için), standart çıktı (geleneksel çıktı yazmak için) ve standart hata (tanı çıktısını yazmak için ).

Başka bir deyişle, hatalar, hata ayıklama bilgileri ve tanılama kategorisine giren her şey girer stderr.

Daha fazla bilgi için ilgili soruya bakın: İlerleme raporları / günlük bilgileri stderr veya stdout'a ait mi?

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.