我正在尝试编写一个简单的脚本来监视我的网络状态,而没有所有ping
的输出:
ping -q -c 1 google.com > /dev/null && echo online || echo offline
Run Code Online (Sandbox Code Playgroud)
问题是,当我没有连接时,我的输出中仍然收到一条错误消息:
ping: unknown host google.com
offline
Run Code Online (Sandbox Code Playgroud)
如何在输出中保留此错误消息?
dar*_*nir 28
当你运行时:
ping -q -c 1 google.com > /dev/null && echo online || echo offline
Run Code Online (Sandbox Code Playgroud)
您实际上只是将 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
Run Code Online (Sandbox Code Playgroud)
但是,请注意我们已经将一个流重定向到/dev/null
. 为什么不简单地搭载同一个重定向?Bash 允许我们通过指定要重定向到的流编号来做到这一点。2>&1
.
注意&
重定向操作符后面的字符。这告诉 shell 接下来出现的不是文件名,而是输出流的标识符。
ping -q -c 1 google.com > /dev/null 2>&1 echo online || echo offline
Run Code Online (Sandbox Code Playgroud)
小心重定向操作符,它们的顺序很重要。如果您以错误的顺序重定向,最终会得到意想不到的结果。
另一种实现完全静音的方法是将所有输出流重定向到/dev/null
使用此快捷方式:(&>/dev/null
或使用 重定向到日志文件&>/path/to/file.log
)。
因此,将您的命令写为:
ping -q -c 1 google.com &> /dev/null && echo online || echo offline
Run Code Online (Sandbox Code Playgroud)
您需要重定向标准输出 ( >
or 1>
) 和标准错误 ( 2>
):
ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline
Run Code Online (Sandbox Code Playgroud)
或者,将一个重定向到另一个:
ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
Run Code Online (Sandbox Code Playgroud)
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
根据您的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
Run Code Online (Sandbox Code Playgroud)
fing 失败的速度要快得多
$ 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
Run Code Online (Sandbox Code Playgroud)