Tại sao lệnh grep này không hoạt động?


24

Khi tôi cố gắng sử dụng grep theo cách này:

service --status-all | grep network

Nó vẫn liệt kê tất cả các dịch vụ mặc dù tôi đã đưa nó vào grepđể hạn chế nó chỉ trong chuỗi "mạng"


Sau sự thật:

Thông báo bài viết này giải thích lý do tại sao lệnh hành xử theo cách này, đó là những gì tôi thích về linux, luôn có một lý do chính đáng, nhưng không cần thiết trực quan

Câu trả lời:


41

Thử:

service --status-all |& grep network

Các ứng dụng dòng lệnh có thể in ra hai luồng văn bản được gọi là tiêu chuẩn ra (stdout) và lỗi tiêu chuẩn (stderr). Theo mặc định, thiết bị đầu cuối chỉ hiển thị đầu ra cho cả hai giống hệt nhau.

Stdout được đưa ra số 1, và stderr được đưa ra số 2. Theo mặc định, các nhà khai thác chuyển hướng, như >, |<chỉ áp dụng cho thiết bị xuất chuẩn, số 1.

|&kết hợp cả thiết bị xuất chuẩn và thiết bị xuất chuẩn cùng với quy trình trên luồng đầu vào tiêu chuẩn (stdin) bên phải, giúp grepcông việc như bạn mong đợi.

Tôi không biết tại sao service --status-allviệc in ra thiết bị lỗi chuẩn ở đây, nhưng nói chung, việc có một luồng stderr riêng biệt rất hữu ích, vì nó cho phép bạn thấy các lỗi ngay cả khi thiết bị xuất chuẩn bị tắt tiếng.


Cảm ơn câu trả lời, dường như điều này đã tạo ra rất nhiều sự quan tâm. Vì vậy, tôi đoán tôi không phải là người duy nhất có vấn đề này.
Meer Borg

4

Bạn cần chuyển hướng luồng lỗi tiêu chuẩn ( 2) sang đầu ra tiêu chuẩn ( 1):

service --status-all 2>&1 | grep network

Toán tử >thường chuyển hướng đến tập tin (ví dụ 2>/tmp/file). Để chuyển hướng đến luồng khác bằng cách sử dụng bộ mô tả , nó cần được đi trước &(lưu ý không có khoảng trắng giữa các ký tự).

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.