Bir Hata Olmadan Çıktı Olmadan Arka Planda Nasıl Komut Çalıştırırsınız?
Meşgul bir insansanız, ihtiyacınız olan son şey, çok miktarda 'işe yaramaz' bildirimle rahatsız edilmek demektir, peki işleri nasıl susturuyorsunuz? Bugünün SuperUser Q&A yazısının bir okuyucunun çıktı miktarını azaltmasına yardımcı olmak için bazı büyük cevapları var..
Bugünün Soru ve Cevap oturumu bize topluluk tarafından yönlendirilen bir soru-cevap web sitesi grubu olan Stack Exchange'in bir alt birimi olan SuperUser'ın izniyle geliyor..
Soru
SuperUser okuyucu Xster, bir hata olmadıkça arka planda bir çıktısız komutun nasıl çalıştırılacağını bilmek ister:
Bir komutun çıktısını nasıl bastırırsınız, ancak komutun çıkışı bir hata kodlarsa bunu gösterin?
Hata olmadıkça, çıktısız arka planda çalışacak komutu nasıl alırsınız??
Cevap
Süper Kullanıcı Katkıda Bulunanlar Bob ve Maximillian Laumeister bizim için cevapları var. İlk önce, Bob:
Ne yazık ki, bu varsayım stderr sadece hata çıkışı için kullanılır her zaman doğru değildir. Daha doğrusu, stderr genellikle tüm etkileşimli çıktılar ve tanılamalar için kullanılır (yani, kullanıcının etkileşimli bir istemde okuması amaçlanan çıktı).(1) wget ve gg iyi bilinen örnekler.
Bazı komutlar bir bayrak sağlayacaktır (yani. -sessiz veya -sessizHatalı olmayan çıkışı bastırmak için). Var olup olmadığını görmek için adam sayfalarını okuyun..
Daha sık tutan diğer bir kongre, çıkış kodu, bir program çıktığında bir çıkış kodu döndürür. Tipik(2), bir çıkış kodu 0 başarıyı belirtir ve diğer herhangi bir çıkış kodu bir hatayı gösterir.
İle darbe, son komutun çıkış kodunu $? değişken. İçinde balık, kullan $ durumu değişken. Boru olabilir stderr geçici bir dosyaya ve yalnızca bir hata oluşursa yazdırın. Örneğin (balık):
Komutları zincirlemiyorsanız bazı kısayolları da kullanabilirsiniz:
Veya:
Ayrıca boru stdout'u kullanarak aynı arabelleğe 2> & 1> / tmp / outputbuffer.
(Not: Aslında bilmiyorum balık, bu yüzden kavramı belgelerinde bulabildiğim şeye adapte ediyorum. Sözdizimi biraz yanlış olabilir. Ayrıca, kullanabilirsiniz mktemp benzersiz bir geçici dosya oluşturmak için. Çalıştırın ve dosya adını değişkene kaydedin.)
Her şeyi aynı anda etkileşimli olarak kullandığınız bir kabuğun arka planında çalıştırmanız gerekirse, o zaman çıktıyı gizlemek ve bu komut dosyasını arka planda standart tekniklerle çalıştırmak için bir komut dosyası yazmaktan daha iyidir. (balık). Heck, aşağıdaki işlevi gibi bir şey koyabilirsiniz ~ / .Config / balık / config.fish:
İle ara sessiz çalışan bir komut (takip eden yer & arka planda çalışmasına neden olur)
Bunun orijinal çıkış kodunu yutacağını ve her ikisini de sileceğini unutmayın. stdout'u ve stderr başarısızlık durumunda. Gerektiği gibi özelleştirebilirsiniz.
(1) Hata çıktısının görünmeyeceğinin garantisi yoktur. stdout'u, bazı programlar tüm çıktıları oraya atacak!
(2) Ne yazık ki, bu hala her zaman böyle değil. Çıkış kodu program tarafından tamamen kontrol edilir ve bazıları sıfır olmayan çıkışlarla bazı başarı koşulları gösterecektir. Yine kılavuzu kontrol edin..
Maximillian Laumeister tarafından verilen cevabın ardından:
Unix yardımcı programları genel mesajları stdout'u, ve hata mesajlarına stderr, bu yüzden sadece hata mesajlarını görmek istiyorsak, gizlemek için yeterli olacaktır. stdout'u yani sadece stderr konsola çıktı alır.
Bunu yapmanın yolu (her ikisinde de) darbe ve balık) eklemek > / Dev / null Komuta Bu borular stdout'u hiçliğe stderr (hata mesajlarınızla) hala konsola geliyor.
Mesela:
Komuta yankı 1> / dev / null hiçbir şey yazdırmaz, çünkü normal stdout'u çıktı bastırılmış ve hiçbir şey yazılmamış stderr.
Komuta adam yok mu> / dev / null bir hata mesajı yazdırıyor, çünkü adam hata mesajını yazıyor stderr.
Açıklamaya eklemek için bir şey var mı? Yorumlarda ses kesiliyor. Diğer teknoloji meraklısı Stack Exchange kullanıcılarından daha fazla cevap okumak ister misiniz? Burada tüm tartışma konusuna göz atın.