Linux 当命令作为变量传递时,如何将stdout/stderr重定向包含在命令替代中?

Linux 当命令作为变量传递时,如何将stdout/stderr重定向包含在命令替代中?,linux,bash,io-redirection,command-substitution,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

重新启动路由器后,当网络重新启动时,我需要检测以下脚本:

#!/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
在地下室被执行死刑

ping 192.168.1.1 -c 3 '&>/dev/null'
如何更改命令替换调用,使bash不会在输出重定向周围加单引号?

它们处理重定向和管道,而不会出现困扰变量的引号问题

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

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

while ! pingCommand; do
   sleep 3s;
done
使用
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

相关的所有潜在陷阱,我正在检查它的退出代码,但问题是,如果有任何错误,它们将显示在终端上,这是我不想要的。它们不会,因为您有
&>/dev/null
,它同时隐藏了stdout和stderr。最初,我没有
&>/dev/null
,所以它显示了错误。当我将
&>/dev/null
添加到上面的脚本中时,它就坏了,因此问题是hahaor甚至sh-c$pingCommand@fche,
bash-c…
你的意思是。POSIX Shell无法
&>
重定向。