Bash
如何重定向任何命令的輸出?
我正在嘗試編寫一個簡單的腳本來監視我的網路狀態,而沒有所有
ping
的輸出:ping -q -c 1 google.com > /dev/null && echo online || echo offline
問題是,當我沒有連接時,我的輸出中仍然收到一條錯誤消息:
ping: unknown host google.com offline
我怎樣才能在我的輸出中保留這個錯誤消息?
當你執行時:
ping -q -c 1 google.com > /dev/null && echo online || echo offline
您實際上只是將 Stream 1 的輸出(即
stdout
)重定向到/dev/null
.當您想要重定向程序正常執行產生的輸出時,這很好。但是,如果您還希望重定向由所有錯誤、警告或失敗引起的輸出,您還應該將
stderr
或標準錯誤流重定向到/dev/null
.這樣做的一種方法是將您希望重定向到重定向運算符的流的編號添加到前面,
>
如下所示:Command 2> /dev/null
因此,您的命令將如下所示:
ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline
但是,請注意我們已經將一個流重定向到
/dev/null
. 為什麼不簡單地搭載相同的重定向?Bash 允許我們通過指定要重定向到的流號來做到這一點。2>&1
.注意
&
重定向運算符後面的字元。這告訴 shell 接下來出現的不是文件名,而是輸出流的標識符。ping -q -c 1 google.com > /dev/null 2>&1 echo online || echo offline
小心重定向操作員,他們的順序很重要。如果您以錯誤的順序重定向,您最終會得到意想不到的結果。
獲得完全靜音的另一種方法是將所有輸出流重定向到
/dev/null
使用此快捷方式:(&>/dev/null
或使用 重定向到日誌文件&>/path/to/file.log
)。因此,將您的命令編寫為:
ping -q -c 1 google.com &> /dev/null && echo online || echo offline