Bash 忽略shell脚本输出中的错误

Bash 忽略shell脚本输出中的错误,bash,shell,if-statement,ping,dev-null,Bash,Shell,If Statement,Ping,Dev Null,如果ICMP echo失败,我想省略IF语句中的错误 示例代码: if ping -q -c 1 -W 1 1.2.3.4 >/dev/null; then echo -e "PING OK" else echo -e "PING NOK" fi 如果ping成功或者您在脚本之外运行命令,它将非常有效,但是如果没有响应,它将给出以下输出 PING 1.2.3.4 (1.2.3.4): 56 data bytes --- 1.2.3.4 ping statistics --- 1

如果ICMP echo失败,我想省略IF语句中的错误

示例代码:

if ping -q -c 1 -W 1 1.2.3.4 >/dev/null; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi
如果ping成功或者您在脚本之外运行命令,它将非常有效,但是如果没有响应,它将给出以下输出

PING 1.2.3.4 (1.2.3.4): 56 data bytes

--- 1.2.3.4 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING NOK
我已经看到了引用2>/dev/null的答案,但是这会在输出中显示整个ping查询,无论成功与否!示例2>/dev/null如下

PING 1.2.3.4 (1.2.3.4): 56 data bytes

--- 1.2.3.4 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 26.134/26.134/26.134/0.000 ms
PING OK
这是一个n00b问题,但我是一个网络伙伴,不是开发人员:)


提前谢谢

经典解决方案:

if ping -q -c 1 -W 1 1.2.3.4 >/dev/null 2>&1; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi
一种更现代(但不符合POSIX!)的方法,自BASH 4开始提供:

if ping -q -c 1 -W 1 1.2.3.4 &>/dev/null; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi

这两种方法都意味着“将STDOUT和STDERR重定向到/dev/null”,但第一种方法是按顺序执行的,首先重定向STDOUT,然后将STDERR重定向到STDOUT。

您也可以使用退出状态


完美的非常感谢。@LiamMulligan,我的荣幸。别忘了将问题标记为已解决。使用
&>
并不是“更现代”。这是一个违反shell标准的可怕的黑客行为(或者充其量是利用标准中的模糊性)。与posix兼容的shell会将
cmd&>/dev/null
解释为异步执行cmd,然后执行到/dev/null的简单重定向。这是一个最好避免的构造。@williampersell“在哪里将
&>
解释为单个文本,在哪里不解释,这难道不是非常清楚吗?”?赋值也会发生同样的情况:
variable=0
0
赋值给
$variable
,而
variable=0
执行名为
variable
的命令或函数,将
=
作为第一个参数传递,将
0
作为第二个参数传递。根据标准,令牌识别第6项,
&>
字符串应解释为2个标记。第2项可以取代第6项,但前提是允许将
&>
作为运算符…但标准不将
&>
识别为运算符,因此以这种方式解析输入与标准冲突。
ping -q -c 1 -W 1 1.2.3.4 >/dev/null 2>&1
[ $? -eq 0 ] && echo "Ping OK" || echo "Ping NOK"