Điều đó không liên quan gì grep- đó là vì đường ống |chuyển hướng luồng đầu ra tiêu chuẩn stdouttrong khi các Permission deniedthông báo nằm trong luồng lỗi tiêu chuẩn stderr. Bạn có thể đạt được kết quả bạn muốn bằng cách kết hợp các luồng bằng cách sử dụng 2>&1(chuyển hướng luồng có bộ mô tả tệp 2đến luồng có bộ mô tả tệp 1) để stderrcũng như stdoutđược dẫn đến đầu vào của lệnh grep
find / -name libGL.so.1 2>&1 | grep -v 'denied'
nhưng sẽ bình thường hơn nếu chỉ loại bỏ stderrhoàn toàn bằng cách chuyển hướng nó đến/dev/null
find / -name libGL.so.1 2>/dev/null
Sử dụng | & thay vì 2> & 1 |
Nếu bạn xem trang người đàn ông Bash, bạn sẽ có thể nhận thấy điều này:
Nếu |&được sử dụng, lỗi tiêu chuẩn của lệnh được kết nối với đầu vào tiêu chuẩn của lệnh2 thông qua đường ống; nó là tốc ký cho 2>&1 |.
Vì vậy, bạn cũng có thể sử dụng cấu trúc này nếu bạn muốn tham gia STDERR và STDOUT:
find / -name libGL.so.1 |& grep -v 'denied'
/foo/bar/denied/libGL.so.1, kết hợpstdoutvàstderrsau đó lọc sẽ ẩn kết quả