如何重定向任何命令的输出?


14

我正在尝试编写一个简单的脚本来监视我的网络状态,而没有所有ping的输出:

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

问题是,当我未连接时,我的输出中仍然出现错误消息:

ping: unknown host google.com
offline

如何将错误消息排除在输出之外?

Answers:


28

运行时:

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

您实际上只是将流1的输出(即stdout)重定向到/dev/null

当您想重定向程序正常执行所产生的输出时,这很好。但是,如果您还希望将由所有错误,警告或故障引起的输出重定向,则还应该将stderror标准错误流重定向到/dev/null

一种方法是在您希望重定向到重定向运算符的流编号之前添加前缀,>如下所示:Command 2> /dev/null

因此,您的命令如下所示:

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

但是请注意,我们已经将一个流重定向到/dev/null。为什么不简单地piggy带相同的重定向?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

1
啊哈&>/dev/null它。谢谢大家的即时帮助!
operalala

4
Be careful with the redirection operators, their order matters a lot.,但您没有提供实际使用的示例2>&1
Izkata 2014年

我忘记添加了!编辑答案以反映示例。当我有更多时间可用时,我将说明订购的工作原理。
darnir 2014年

9

您需要同时重定向标准输出(>1>)和标准错误(2>):

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

或者,将一个重定向到另一个:

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

例子

$ 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

加快ping

根据您的ping实现,您可能会被限制为一个计数-c 1。某些实现会让您跌破此限制,但实际上您必须等待错误的查询才能超时。因此,除了使用之外,ping您可能还想使用fing

ping失败的速度

$ 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

失败要快得多

$ 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
我宁愿使用time命令,也不愿手动计算时间差datetime { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
Ruslan 2014年

@Ruslan-谢谢,我这样做是b / c,我想要输出date。IMO,其他人更容易读取生成的输出。
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.