Boru kullanma neden grep burada çalışmıyor?


18

Aşağıdaki komut var:

find / -name libGL.so.1

"İzin reddedildi" ile birçok satır döndürür. Bu satırları hariç tutmak istiyorum, bu yüzden aşağıdakileri ekledim:

find / -name libGL.so.1 | grep -v 'denied'

Ama çıktı aynı - benim grep -v 'denied'ile hatları filtreleme değil Permission denied. Birçok varyasyon denedim, grep eğiticilerine baktım, ancak sorunu anlayamıyorum. Herhangi bir öneri?

Yanıtlar:


44

Yani bir ilgisi var grep- Boru yüzünden olduğunu |standart çıkış akışı yönlendirir stdoutoysa Permission deniedmesajlar standart hata akışında bulunmaktadır stderr. Sen kullanarak akışları birleştirerek istediğiniz sonucu elde edebiliriz 2>&1(kimin dosya belirleyicisidir akışı yönlendirme 2kimin dosya belirleyicisidir akışına 1böylece) o stderrsıra sıra stdoutgrep komutunun girişine borulu alır

find / -name libGL.so.1 2>&1 | grep -v 'denied'

ancak, onu stderryeniden yönlendirerek tamamen atmak daha olağan olurdu ./dev/null

find / -name libGL.so.1 2>/dev/null

2 yerine & &>> 1 |

Bash man sayfasına bir göz atarsanız, muhtemelen bu bulanıklığı fark edeceksiniz:

Eğer |&kullanılır, komutun standart hata borusunun içinden Command2'ı standart girişine bağlanır; için kestirme 2>&1 |.

STDERR ve STDOUT'a katılmak istiyorsanız bu yapıyı da kullanabilirsiniz:

find / -name libGL.so.1 |& grep -v 'denied'

3
Bunları birleştirmeyle ilgili ek not: Dosyanın garip bir nedeni varsa /foo/bar/denied/libGL.so.1, birleştirmek stdoutve stderr ardından filtrelemek sonucu gizler
Izkata

5

Komutunuz:

find / -name libGL.so.1 2>/dev/null

Find, standart hataya (fd2) ilişkin izinlerden şikayet ediyor. Bu satırları ortadan kaldırmak için standart bit bit grubuna (/ dev / null) yönlendirin (>).


4

"İzin reddedildi" satırları stderr (standart hata) akışına gidiyor, ancak grep aracılığıyla stdout'u (standart çıkış) oluşturuyorsunuz.

Stderr'ı tümüyle

find / -name libGL.so.1 2> /dev/null

2

Komutu sudo ile çağırmayı denediniz mi?

sudo find / -name libGL.so.1

Hala mesajı gösteriyorsa, stderr'in (fd = 2) nirvana'ya (/ dev / null) daha önce bahsedilen yönlendirmesini kullanın :

sudo find / -name libGL.so.1 2> /dev/null

Burada daha fazla fikir , iyi şanslar!

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.