Mengapa grep menggunakan pipa tidak berfungsi di sini?


18

Saya memiliki perintah berikut:

find / -name libGL.so.1

Yang mengembalikan banyak baris dengan "Izin ditolak". Saya ingin mengecualikan baris seperti itu, jadi saya menambahkan yang berikut:

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

Tapi hasilnya sama - saya grep -v 'denied'tidak menyaring garis dengan Permission denied. Saya sudah mencoba banyak variasi, melihat-lihat tutorial grep, tetapi saya tidak dapat memecahkan masalahnya. Ada saran?

Jawaban:


43

Itu tidak ada hubungannya dengan grep- itu karena pipa |mengarahkan aliran output standar stdoutsedangkan Permission deniedpesan berada di aliran kesalahan standar stderr. Anda dapat mencapai hasil yang Anda inginkan dengan menggabungkan aliran menggunakan 2>&1(redirect aliran yang file descriptor-nya 2ke stream yang file descriptor-nya 1) sehingga stderrjuga stdoutdapat disalurkan ke input dari perintah grep

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

tetapi akan lebih biasa untuk membuang stderrsemuanya dengan mengarahkannya ke/dev/null

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

Menggunakan | & bukannya 2> & 1 |

Jika Anda melihat halaman manual Bash Anda mungkin akan melihat uraian ini:

Jika |&digunakan, kesalahan standar perintah terhubung ke input standar command2 melalui pipa; itu adalah singkatan 2>&1 |.

Jadi, Anda juga dapat menggunakan konstruk ini jika Anda ingin bergabung dengan STDERR dan STDOUT:

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

3
Catatan tambahan untuk menggabungkan mereka: Jika karena alasan yang aneh file tersebut ada pada /foo/bar/denied/libGL.so.1, menggabungkan stdoutdan stderr kemudian memfilter akan menyembunyikan hasilnya
Izkata

5

Perintah Anda harus:

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

Find mengeluh tentang izin kesalahan standar (fd2). Untuk menghilangkan garis-garis itu, redirect (>) standar ke luar bit bucket (/ dev / null).


4

Baris "izin ditolak" mengarah ke aliran stderr (kesalahan standar), tetapi Anda mem-pipkan stdout (keluar standar) melalui grep.

Anda dapat mengalihkan sepenuhnya stderr dengan

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

2

Sudahkah Anda mencoba memanggil perintah dengan sudo ?

sudo find / -name libGL.so.1

Jika masih menampilkan pesan, gunakan redirect stderr (fd = 2) yang telah disebutkan ke nirwana (/ dev / null) :

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

Lebih banyak ide di sini , semoga berhasil!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.