Linux 无法在脚本中将stderr/stdout重定向到/dev/null

Linux 无法在脚本中将stderr/stdout重定向到/dev/null,linux,bash,ping,Linux,Bash,Ping,在我的脚本中,我基本上需要等待linux机器上的网络接口(例如en0、eth0等)完全初始化,然后脚本才能继续。我不希望在等待时有任何输出,我正在这样等待: #!/bin/bash printf "\nWaiting for the network to start...\n" ping_status=$(ping -c 1 server &>/dev/null | egrep -m 2 -e "[0-9]+") i=0 while [ -z "$status" ] do

在我的脚本中,我基本上需要等待linux机器上的网络接口(例如en0、eth0等)完全初始化,然后脚本才能继续。我不希望在等待时有任何输出,我正在这样等待:

#!/bin/bash

printf "\nWaiting for the network to start...\n"

ping_status=$(ping -c 1 server &>/dev/null | egrep -m 2 -e "[0-9]+")
i=0
while [ -z "$status" ]
do
   if [ "$i" -eq 30 ]
   then
      printf "\nServer unresponsive for 30 seconds.  Quitting script\n"
      exit 1
   else
      sleep 1
      i=$((i+1))
      ping_status=$(ping -c 1 server &>/dev/null | egrep -m 2 -e "[0-9]+")
   fi
done
问题是,在网络初始化之前,我会得到以下输出:

connect: Network is unreachable
connect: Network is unreachable
命令
ping-c1server&>/dev/null | egrep-m2-e“[0-9]+”
正确解析成功ping的第二行并告诉我字节,因此如果返回值为null,我知道网络没有启动

然而,出于某种原因,我在当前目录中得到了一个实际的
egrep
文件,并且仍然得到了上面的输出
connect:Network is unreable

  • 如何测试ping是否成功并放弃所有输出和错误

使用此结果。这将解决问题

&>
从第4版开始,操作员在所有
bash
中都起作用。您可能需要检查这一点(请参见示例中的)

也就是说,由于您只想重定向错误,我建议您应该使用:

ping -c 1 server 2> /dev/null

这是因为
ping
命令的输出已经存储在
ping\u状态中

,即使单个命令对我不起作用<代码>状态=$(ping-c1服务器&>/dev/null | egrep-m2-e“[0-9]+”)
Nope。空结果。您正在将o/p重定向到/dev/null。那你怎么能把它弄出来呢
ping-c1127.0.0.1&>/dev/null
@Antarus好的一点,我想我根本不想要任何输出,除非ping成功。此外,对于这个例子,你根本不需要grep。。。ping正确设置退出状态<代码>在ping-c1服务器时&>/dev/null;做完成
就足够了。@Anishan使用此方法时运气不佳。
服务器
的值是多少?
服务器
只是一个dns名称。@n请尝试对服务器进行基本ping。我认为网络设置有问题。网络设置没有问题。机器快速启动,在网络完全初始化之前,ping返回
connect:network不可访问
,因为信息在arp表中。我只是想在等待消息启动时把它处理掉。这就是诀窍。谢谢另外,我阅读bash手册页,它更喜欢您使用
&>
,但却没有提到任何关于版本可用性的内容,这让我很恼火!抢手货
ping -c 1 server 2> /dev/null