Làm thế nào để chuyển hướng đầu ra của bất kỳ lệnh nào?


14

Tôi đang cố gắng viết một tập lệnh đơn giản để theo dõi trạng thái mạng của mình mà không cần tất cả pingđầu ra:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

Vấn đề là khi tôi không được kết nối, tôi vẫn nhận được thông báo lỗi trong đầu ra của mình:

ping: unknown host google.com
offline

Làm thế nào tôi có thể giữ thông báo lỗi này ra khỏi đầu ra của tôi?

Câu trả lời:


28

Khi bạn chạy:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

Về cơ bản, bạn chỉ chuyển hướng đầu ra của Luồng 1 (tức là stdout) sang /dev/null.

Điều này tốt khi bạn muốn chuyển hướng đầu ra được tạo ra bởi sự thực thi bình thường của một chương trình. Tuy nhiên, trong trường hợp bạn cũng muốn chuyển hướng đầu ra do tất cả các lỗi, cảnh báo hoặc lỗi, bạn cũng nên chuyển hướng stderrluồng hoặc Lỗi tiêu chuẩn sang /dev/null.

Một cách để làm điều này là chuẩn bị số lượng luồng bạn muốn chuyển hướng đến toán tử chuyển hướng, >như sau:Command 2> /dev/null

Do đó, lệnh của bạn sẽ giống như:

ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline

Nhưng, lưu ý rằng chúng tôi đã chuyển hướng một luồng đến /dev/null. Tại sao không đơn giản là cõng trên cùng một chuyển hướng? Bash cho phép chúng ta làm điều này bằng cách chỉ định số luồng để chuyển hướng đến. 2>&1.

Chú ý &ký tự sau toán tử chuyển hướng. Điều này nói với shell rằng những gì xuất hiện tiếp theo không phải là tên tệp mà là định danh cho luồng đầu ra.

ping -q -c 1 google.com > /dev/null 2>&1  echo online || echo offline

Hãy cẩn thận với các toán tử chuyển hướng, thứ tự của họ rất quan trọng. Nếu bạn chuyển hướng không đúng thứ tự, bạn sẽ có kết quả không mong muốn.

Một cách khác để bạn có thể đạt được sự im lặng hoàn toàn là bằng cách chuyển hướng tất cả các luồng đầu ra sang /dev/nullsử dụng phím tắt này: &>/dev/null(hoặc chuyển hướng đến một tệp nhật ký với &>/path/to/file.log).

Do đó, hãy viết lệnh của bạn là:

ping -q -c 1 google.com &> /dev/null && echo online || echo offline

1
Aha &>/dev/nullnó được. Cảm ơn tất cả các bạn đã giúp đỡ ngay lập tức!
operalala

4
Be careful with the redirection operators, their order matters a lot., nhưng bạn đã không bao gồm một ví dụ về việc thực sự sử dụng2>&1
Izkata

Tôi đã quên để thêm điều đó! Chỉnh sửa câu trả lời để phản ánh ví dụ. Khi tôi có thêm một chút thời gian trên tay, tôi sẽ giải thích cách đặt hàng cũng hoạt động.
darnir

9

Bạn cần chuyển hướng cả đầu ra tiêu chuẩn ( >hoặc 1>) và lỗi tiêu chuẩn ( 2>):

ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline

hoặc, chuyển hướng cái này sang cái khác:

ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

8
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

Ví dụ

$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online

$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline

Tăng tốc ping

Tùy thuộc vào pingviệc thực hiện của bạn, bạn có thể bị giới hạn trong một số lượng duy nhất -c 1. Một số triển khai sẽ cho phép bạn đi dưới mức này, nhưng về cơ bản bạn phải chờ đợi những lần tra cứu xấu sắp hết thời gian. Vì vậy, thay vì sử dụng, pingbạn có thể muốn sử dụng fingthay thế.

sự chậm chạp của ping thất bại

$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014

$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014

ngón tay nhanh hơn nhiều để thất bại

$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014

$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014

1
Tôi thà sử dụng timelệnh hơn là tính toán chênh lệch thời gian theo cách thủ công với date:time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
Ruslan

@Ruslan - cảm ơn, tôi đã làm theo cách này b / c Tôi muốn đầu ra của date. IMO dễ dàng hơn, cho người khác đọc đầu ra được tạo.
slm
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.