SORU
14 ŞUBAT 2009, CUMARTESİ


Nasıl STDOUT STDERR yönlendirmek, ama özgün STDOUT görmezden gelebilir miyim?

Ve vb grep kontrol çalıştırmak istediğiniz bir program var.

STDOUT yönlendirerek ve grep yapabilirim, ama sorun şu ki, benimdeğilSTDOUT özgün içerik istiyor.

Yani, bu bir işe yaramaz

cmd 2>&1 | grep pattern

özgün STDOUT ve STDERR karışımı çünkü.

Ve bu bir grep STDERR çıktı okumaz beri çalışmıyor:

cmd 1>/dev/null | grep pattern

Ama aynı zamanda bu bir işe yaramaz:

cmd 1>/dev/null 2>&1 | grep pattern

çıktı her şey 13 ** yazılı aldığından tamamen boş olacak çünkü.

Ama bunu yapmak için basit bir yolu olmalı?

CEVAP
14 ŞUBAT 2009, CUMARTESİ


Ne işe yaramazsa:

Nedeni son komutu alıntı:

cmd 1>/dev/null 2>&1 | grep pattern

çalışmıyor, yönlendirme işleri sipariş üzerine bir karışıklık kaynaklanıyor. Beklenen son alıntı yönlendirmesi için uygulanabilir olanları önce her çıkış, o çıkış orijinal standart çıktı dosyası tanımlayıcı (1) gidecek /dev/null ve çıkış için standart hata tanımlama dosyası (2) Gider orijinal standart çıktı.

Ancak, bu kabuk yeniden yönlendirme nasıl çalıştığını değildir. Her yeniden yönlendirme neden olur dosya tanımlayıcıları için "yeniden yaptırılması" kapanış "kaynak" ve çoğaltma "hedef" haline (man sayfa dup(2) close(2)), için. Bu komut, standart çıktı ilk ** 18 /dev/null standart hata standart çıkış yerine, yerine zaten olduğu anlamına gelir.

Ne çalışıyor:

Bu nedenle, istenen etkiyi elde etmek için, sadece yönlendirmeler ters gerekir. Standart hata standart çıktı gitmek zorunda kalacak, ve orijinal standart /dev/null git çıkış:

cmd 2>&1 >/dev/null | grep pattern

(> önce 1 gereksiz bir çıkış yönlendirme için standart çıkış varsayılan) not

< / ^ hr .

EkCharlie &- için bir dosya tanıtıcı kapatmak için yönlendirme bahsetti. Eğer bu uzantıyı destekleyen bir etkileşimli kabuk (bash ve bazı diğer uygulamalar, ama hepsi değil yapmak ve not standard) kullanıyorsanız, aynı zamanda gibi, bunu yapabilirsiniz:

cmd 2>&1 >&- | grep pattern

Bu olabilir daha iyi olabilir kaydetmek biraz zaman, çünkü ne zaman komut çalışır yazmak için standart çıkış aramak write başarısız hemen beklemeden bir içerik anahtarı içine çekirdek ve sürücü taşıma /dev/null (bağlı olarak sistem arama uygulaması - bazı yakalayabilir bu libc işlevi, ve bazıları da özel kullanım için /dev/null). Eğer değerli olabilir çıktı bir sürü varsa, ve yazmak için daha hızlı.

Bu genelde çoğu program eğer standart çıktı gerçekten printf? dönüş değeri denetler (kim) yazmak için başarısız olursa umurumda değil çünkü ve standart çıkış kapalı olduğundan sakıncası olmaz. Ama bazı programlar write - genellikle blok işlemciler, programları G/Ç için biraz dikkatli kütüphane kullanarak veya çıkış stdandard giriş başarısız olursa, bir hata kodu ile kurtarmak. Eğer çalışmıyor olsaydı zaten bu olası bir neden olduğunu unutmayın ve /dev/null deneyin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Boiler Room

    Boiler Room

    10 Mayıs 2012
  • Liberator

    Liberator

    14 EYLÜL 2007