Tại sao grep không sử dụng ống làm việc ở đây?


18

Tôi có lệnh sau:

find / -name libGL.so.1

Trả về rất nhiều dòng với "Quyền bị từ chối". Tôi muốn loại trừ các dòng như vậy, vì vậy tôi đã thêm vào như sau:

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

Nhưng đầu ra là như nhau - tôi grep -v 'denied'không lọc ra các dòng với Permission denied. Tôi đã thử nhiều biến thể, xem qua các hướng dẫn của grep, nhưng tôi không thể tìm ra vấn đề. Bất kỳ đề xuất?

Câu trả lời:


43

Đ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'

3
Lưu ý bổ sung về việc kết hợp chúng: Nếu vì một lý do kỳ quái nào đó, tập tin tồn tại /foo/bar/denied/libGL.so.1, kết hợp stdoutstderr sau đó lọc sẽ ẩn kết quả
Izkata

5

Lệnh của bạn phải là:

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

Tìm là phàn nàn về quyền trên lỗi tiêu chuẩn (fd2). Để loại bỏ các dòng đó, chuyển hướng (>) tiêu chuẩn ra nhóm bit (/ dev / null).


4

Các dòng "quyền bị từ chối" sẽ chuyển đến luồng stderr (lỗi tiêu chuẩn), nhưng bạn đang đặt chuẩn stdout (tiêu chuẩn ra) thông qua grep.

Bạn có thể chuyển hướng hoàn toàn stderr với

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

2

Bạn đã thử gọi lệnh với sudo chưa?

sudo find / -name libGL.so.1

Nếu nó vẫn hiển thị thông báo, hãy sử dụng chuyển hướng đã được đề cập của stderr (fd = 2) đến nirvana (/ dev / null) :

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

Thêm ý tưởng ở đây , chúc may mắn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.