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?

modulitos
sumber

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'
Steeldriver
sumber
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).

snakeroot
sumber
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
Andrew McGuinness
sumber
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!

manamana
sumber