Hata olmadığı sürece bir komut çıktı olmadan arka planda nasıl çalıştırılır


14

Bir komutun çıktısını nasıl bastırırsınız ama komutun çıkışta bir hata kodladığını gösterir?

Yanıtlar:


17

Ne yazık ki, stderryalnızca hata çıktısı için kullanılan varsayım her zaman doğru değildir. Aksine, stderrgenellikle 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 . wgetve ddiyi bilinen örneklerdir.

Bazı komutlar, hata olmayan çıktıları bastırmak için bir işaret (ör. -quietVeya -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 0baş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, $statusdeğişkeni kullanın . Sen borusunu can stderrgeç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;

stdoutAynı 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, mktempbenzersiz 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ı stdoutve hem stderrarı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.


hafif balık tweak, ~ / .config / fish / function /
Xster

12

Unix yardımcı programları genel iletileri stdoutve hata iletilerini gönderir stderr, bu nedenle yalnızca hata iletilerini görmek istiyorsak, bastırmak yeterli olur, stdoutbu nedenle yalnızca stderrkonsola çıktı alır.

(Her ikisi de Bunu yapmanın yolu bashve fish) eklemektir >/dev/nullkomutuna. Bu borular hiçbir şeye yol açmaz, ancak stderr (hata mesajlarınızla birlikte) konsola gelir.

Örneğin:

Komut echo 1 >/dev/nullhiçbir şey yazdırmaz, çünkü normal stdoutçıktı bastırılır ve stderr'e hiçbir şey yazılmaz.

Komut man doesnotexist >/dev/nullbir hata mesajı yazdırır, çünkü manhata mesajını yazar stderr.


2

Bu, komutu arka planda çalıştırır ve normal çıktıyı yok sayarken hataları bir günlük dosyasına yazar

    command > /dev/null 2> /tmp/example_error.log &
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.