Bulgudan hataları süzmek için grep'i borulu ve amperiyle kullanma


22

Cygdrive'da bir dosya bulmak için cygwin kullanıyorum.

Bununla birlikte, izin reddedilen mesajları bastırmam gerekiyor (aksi halde sonuçlar hata mesajlarında gizlenir). Aşağıdaki komut çalışıyor:

find -name 'myfile.*' |& grep -v "Permission denied"

Ve işaretinin neden bu komuta dahil edilmesi gerektiğini anlamıyorum, bunun işe yarayacağını umuyordum ama işe yaramadı.

find -name 'myfile.*' | grep -v "Permission denied"

Lütfen ve işaretinin anlamını açıklayınız.

Yanıtlar:


24

Unix benzeri sistemlerde, değiştirilmemişlerse ekranınıza çıkış gönderecekleri iki çıkış yolu vardır. Standart hata (veya stderr) çoğu hata ve hata koşulunu yakalayan hatadır.

Stderr'deki izin reddedilen iletiyi "normal çıktı" ile aynı çıktı akışına geçirmek için ikisini birleştirmelisiniz. Örnekte, grep -vüzerinde doğru şekilde çalışabilmeniz için stdout (standart çıktı) ve stderr'i gördüğünüz arcane sözdizimi ile birleştirirsiniz.

Gönderen GNU Bash manuel bölüm 3.2.2 Boru hatları :

' |&' Kullanılıyorsa, komut1’in standart hatası, standart çıkışına ek olarak, komut2’nin boru üzerinden standart girişine bağlanır; için stenodir 2>&1 |. Standart hatanın standart çıktıya dolaysız yönlendirilmesi, komut tarafından belirtilen tüm yönlendirmelerden sonra gerçekleştirilir.

Ayrıca, geirha'nın işaret ettiği gibi, sadece stderr çıktısından kurtulmak istiyorsanız, bunun gibi bir şey yapmak istersiniz.

find -name 'myfile.*' 2> /dev/null

ya da belki

find -name 'myfile.*' 2> /tmp/errorlog

Ayrıca, komutun finddizilişine xargssahipseniz , çıktısını size iletmek gibi komutun tüm bileşenlerinden çıktıyı yakalamak için komut satırının tamamını parantez içine koymanız gerekeceğini unutmayın. Örneğin,

(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 )  2> /dev/null

Eğer parantezleri bırakıp, bunun yerine yaptıysanız -

find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null

yine de find veya egrep dosyasındaki izinleri reddedilen hataları görüyorsunuz, ancak stderr xargs için yönlendirilecek.

Gördüğünüz gibi, muhtemelen bir test çalıştırması sırasında içeriğini görüntüledikten sonra stderr komutunu atarsınız.

Not GNU olduğunu findve bildiğim kadarıyla söyleyebilirim, herhangi POSIX uyumlu find, -printopsiyon örtülü olduğunu. İsterseniz yine de açıkça sağlayabilirsiniz.


Görünüşe göre sadece bash4 + wiki.bash-hackers.org/bash4#redirection
Luke Exton

1
@LukeExton Evet. Diğer kabuklarda, 2>&1 |bunun yerine kullanılabilir |&(yani biri stderr'i açıkça stdout'a yönlendirebilir ve sonra bunu boru hattında bir sonraki komuta iletebilir).
Eliah Kagan,

2> >( grep filter )ayrıca kullanışlıdır
user1133275


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.