当命令作为变量传递时,如何使用命令subsitution包含stdout / stderr重定向?

时间:2016-05-12 13:24:21

标签: linux bash io-redirection command-substitution

我有以下脚本来检测重新启动路由器后网络重新启动的时间:

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

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

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

  

ping:未知主机&> / dev / null

我使用-x选项运行脚本(以启用调试)并找到

ping 192.168.1.1 -c 3 &>/dev/null

正在子shell中执行

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

如何更改命令替换调用,以便bash不会在输出重定向周围放置单引号?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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相关的所有潜在陷阱。