19Aug

Arka planda bir hata olmadığı sürece hiçbir çıktıla birlikte nasıl bir Komutu Çalıştırıyorsunuz?

Eğer meşgul bir kişiyseniz, ihtiyacınız olan son şey çok fazla 'gereksiz' bildirimden rahatsız olmaktır, bu nedenle işleri nasıl yavaşlatırsınız? Bugünün SuperUser Q & A postasında, okuyucunun çıktı miktarını azaltmasına yardımcı olmak için bazı harika cevaplar var.

Bugünkü Soru &Cevap oturumu bize Q & A web sitelerinin topluluk temelli bir gruplandırması olan Stack Exchange'in bir alt bölümü olan SuperUser sayesinde sağlanır.

Soru

SuperUser okuyucu Xster, bir hata olmadığı sürece bir komutun arka planda nasıl çalıştırılacağını bilmek ister:

Bir komut çıktısını nasıl engellersiniz, ancak komutun çıkış kodu bir hatayı mı kodlarsa gösterilsin mi?

Herhangi bir hata olmadıkça arka planda hiçbir çıktı olmadan çalışacak bir komut nasıl alınıyor?

Cevap

SuperUser katılımcıları Bob ve Maximillian Laumeister bize cevap buluyor.İlk olarak, Bob:

Ne yazık ki, stderr 'nin yalnızca hata çıktısı için kullanılması varsayımı her zaman doğru değildir. Aksine, standart , genellikle tüm ve herhangi bir tüm etkileşimli çıktı ve teşhis için kullanılır( diğer bir deyişle, kullanıcıya etkileşimli bir istemi okumak için tasarlanmış çıktı).

( 1) wget ve dd iyi bilinen örneklerdir.

Bazı komutlar, hata dışı çıktıyı engellemek için bir bayrak sağlayacaktır( örn. -quiet veya -silinmiş ).Var olup olmadığını öğrenmek için man sayfalarını okuyun.

Daha sık tutan bir başka sözleşme, çıkış kodundan olup, bir program çıktığında çıkış kodunu döndürür. Tipik olarak ( 2) , 0 'den bir çıkış kodu başarıyı gösterir ve diğer çıkış kodu bir hatayı gösterir.

bash ile son komutun çıkış kodunu $ 'dan alabilir miyiz? değişkeni. balık 'de $ durumu değişkenini kullanın. stderr 'yi geçici bir dosyaya gönderebilir ve yalnızca bir hata oluşursa yazdırır.Örneğin,( balık ): komutları zincirleme değilse

Ayrıca bazı kısayol kullanabilir:

Veya:

Eğer Ayrıca 2 gt aynı tampon boru stdout'u ; & Sons, R1/tmp/ çıktı tamponu .

( Not: Aslında balık bilmiyorum, bu yüzden konsepti belgelerinde bulabileceğim bir şey haline getirdim. Sözdizimi biraz yanlış olabilir. Ayrıca benzersiz bir geçici oluşturmak için mktemp kullanabilirsinizÇalıştırın ve dosya adını bir değişkene kaydedin.)

Aynı anda etkileşimli olarak kullandığınız bir kabuğun arka planındaki her şeyi çalıştırmanız gerekiyorsa, işlemek üzere bir komut dosyası yazmayı daha iyi edersinizçıktı-gizleme ve bu betiği arka planda standart tekniklerle çalıştırma( balık ).Heck, aşağıdaki işleve benzer bir şey koyabilirsiniz ~ /.config/fish/ config.fish :

ile çağrı sessizce bir somecommand &( takip eden ve arka planda çalışmasına neden olur)

Bu işlemin orijinal çıkış kodunu yutacağını ve başarısızlık durumunda stdout ve stderr 'yi dökeceğini unutmayın. Gerektiği gibi özelleştirebilirsiniz.

( 1) stdout 'de hata çıktısının görünmeyeceği garantisi yoktur, bazı programlar tüm çıktıları orada kaldıracaktır!

( 2) Ne yazık ki, bu hala her zaman böyle değildir.Çıkış kodu tamamen program tarafından kontrol edilir ve bazıları sıfır olmayan çıkışlarla bazı başarı koşullarını gösterir. Yine el kitabını kontrol edin.

Unix hizmeti stdout'u genel mesajları göndermek ve biz sadece hata iletilerini görmek istiyorsanız, o zaman ki stdout'u bastırmak için yeterli olacaktır böylece hata iletileri stderr için:

Maximillian Laumeister dan cevap Ardındanyalnızca stderr konsola çıktı alır.

Bunu yapmanın yolu( hem bash hem de balık ), & gt;/dev/ boşa komuta. Bu, 'yi 'yi hiçliğe götürmez, ancak stderr ( hata mesajlarınızla birlikte) yine de konsola gelir.

Yani örneğin:

komutu 1 & gt;/dev/ null normal bir stdout çıktısı bastırıldı ve stderr için hiçbir şey yazılmadığından hiçbir şey yazdırmıyor.

kullanıcısı doesnotexist> gt;/dev/ null , bir hata iletisi yazdırır çünkü kullanıcısı hata iletisini stderr 'ye yazar.

Açıklamaya eklemek için bir şey var mı?Yorumların sesini kapatın. Diğer teknik uzman Stack Exchange kullanıcılarından daha fazla cevap okumak ister misiniz? Buradaki tam tartışma dizinine göz atın.