2016-05-12 44 views
0

我有以下脚本来检测重新启动我的路由器后,当我的网络回来的:当命令作为变量传递时如何在命令替换时包含stdout/stderr重定向?

#!/bin/bash 
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null" 

while [[ ! $($pingCommand) ]]; do 
    sleep 3s; 
done 

然而,在终端中运行时,它打印:

平:未知的主机&>的/ dev/null的

我跑与-x选项的脚本(启用调试),并发现

ping 192.168.1.1 -c 3 &>/dev/null 

正在在子shell执行作为

ping 192.168.1.1 -c 3 '&>/dev/null' 

如何更改我的命令替换呼,这样的bash不把周围的输出重定向单引号?

+2

http://mywiki.wooledge.org/BashFAQ/050 – 123

回答

7

Don't store commands in variables. Use functions.他们处理的重定向和管道没有困扰变量的引用问题。

当您将所有输出重定向到/dev/null时,尝试捕获ping的输出也没有任何意义。如果您只想知道它是否有效,请检查其退出代码。

pingCommand() { 
    ping 192.168.1.1 -c 3 &>/dev/null 
} 

while ! pingCommand; do 
    sleep 3s; 
done 
+0

我检查它是退出代码,但问题是如果有任何错误,它们将显示在终端上,我不想要。 – crimsonspectre

+0

他们不会,因为你有隐藏stdout和stderr的'&>/dev/null'。 –

+0

最初,我没有'&>/dev/null',所以它显示错误。当我在上面的脚本中添加'>/dev/null'时,那是当它打破时,因此问题haha – crimsonspectre

0

使用eval

#!/bin/bash 
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null" 

# set -x # uncomment to see what's going on 

while ! eval $pingCommand ; do 
    sleep 3s; 
done 

而且你不需要[[ ]](表达式求值)或$()(输出捕捉)。

当然,正如John Kugelman在另一个答案中所建议的那样,使用这些函数可以避免与eval相关的所有潜在缺陷。

+1

甚至sh -c $ pingCommand – fche

+1

@fche,'bash -c ...'你的意思。 POSIX shell不能'>重定向。 – Dummy00001