Yanıtlar:
Ne yazık ki, stderr
yalnızca hata çıktısı için kullanılan varsayım her zaman doğru değildir. Aksine, stderr
genellikle etkileşimli herhangi bir çıktı ve tanılama için kullanılır, yani kullanıcının etkileşimli bir istemde okuması amaçlanan çıktı 1 . wget
ve dd
iyi bilinen örneklerdir.
Bazı komutlar, hata olmayan çıktıları bastırmak için bir işaret (ör. -quiet
Veya -silent
) sağlar; birinin olup olmadığını görmek için kılavuz sayfalarını okuyun.
Daha sık yapılan bir başka kural da çıkış kodudur : bir program çıktığında bir çıkış kodu döndürür. Tipik olarak 2 , çıkış kodunun 0
başarılı olduğunu ve diğer çıkış kodlarının bir hata olduğunu gösterir.
İle bash
, son komutun çıkış kodunu $?
değişkenten alabilirsiniz. İçinde fish
, $status
değişkeni kullanın . Sen borusunu can stderr
geçici bir dosyaya ve bir hata oluşursa, yalnızca yazdırmak. Örneğin ( fish
):
command 2>/tmp/outputbuffer
if $status
cat /tmp/outputbuffer
rm /tmp/outputbuffer
Komutları zincirlemiyorsanız bazı kısayolları da kullanabilirsiniz:
if command 2>/tmp/outputbuffer
cat /tmp/outputbuffer
rm /tmp/outputbuffer
Veya:
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
stdout
Aynı tamponu kullanarak da boru oluşturabilirsiniz 2>&1 >/tmp/outputbuffer
.
(Not: Aslında bilmiyorum fish
, bu yüzden konsepti dokümantasyonunda bulabildiklerime uyarlıyorum. Sözdizimi biraz yanlış olabilir. Ayrıca, mktemp
benzersiz bir geçici dosya oluşturmak için kullanabilirsiniz - çalıştırın ve kaydedin bir değişkende dosya adı.)
Her şeyi aynı zamanda etkileşimli olarak kullandığınız bir kabuğun arka planında çalıştırmanız gerekiyorsa, çıktı gizlemeyi işlemek ve bir komut dosyasını standart tekniklerle arka planda çalıştırmak için bir komut dosyası yazmanız daha iyi olur ( fish
). Heck, içine aşağıdaki fonksiyon gibi bir şey koyabilirsiniz ~/.config/fish/config.fish
:
function run-silent
set temp (mktemp)
if $argv 2>&1 >$temp
cat $temp
rm $temp
end
İle ara run-silent somecommand &
(sondaki &
arka planda çalışmasına neden olur)
Bunun orijinal çıkış kodunu yutacağını stdout
ve hem stderr
arıza durumunda hem de döküm yapacağını unutmayın . Gerektiği gibi özelleştirebilirsiniz.
1 Hata çıkışının görünmeyeceğine dair bir garanti bile yok stdout
- bazı programlar tüm çıkışları oraya dökecek!
2 Ne yazık ki, bu her zaman böyle değildir - çıkış kodu program tarafından tamamen kontrol edilir ve bazıları sıfır olmayan çıkışlarla bazı başarı koşullarını gösterecektir. Tekrar, kılavuzu kontrol edin.
Unix yardımcı programları genel iletileri stdout
ve hata iletilerini gönderir stderr
, bu nedenle yalnızca hata iletilerini görmek istiyorsak, bastırmak yeterli olur, stdout
bu nedenle yalnızca stderr
konsola çıktı alır.
(Her ikisi de Bunu yapmanın yolu bash
ve fish
) eklemektir >/dev/null
komutuna. Bu borular hiçbir şeye yol açmaz, ancak stderr (hata mesajlarınızla birlikte) konsola gelir.
Örneğin:
Komut echo 1 >/dev/null
hiçbir şey yazdırmaz, çünkü normal stdout
çıktı bastırılır ve stderr'e hiçbir şey yazılmaz.
Komut man doesnotexist >/dev/null
bir hata mesajı yazdırır, çünkü man
hata mesajını yazar stderr
.