为什么重定向输出会影响 bash 中的测试结果?
-
11-12-2019 - |
题
我正在尝试编写一个脚本来在它们自己的 x 会话中启动 xfce 和 xbmc。
为此,我设置 DISPLAY
值,在后台运行第一个并等待,直到我从 xset q
. 。然后我改变 DISPLAY
并对另一个做同样的事情。
我正在一点一点地写这篇文章,以检查每个部分的语法是否正确,而我坚持的部分是“等待,直到我从 xset q
.
export DISPLAY=":0.0"
while [[ ! `xset q` ]]
do
echo -n "."
done
这段代码似乎可以工作,所以当 XFCE 运行时它会立即退出,当它不运行时它会在那里打印 .xset: unable to open display ":0.0"
但是我不想看到的输出 xset
所以我试图重定向它的输出。
export DISPLAY=":0.0"
while [[ ! `xset q > /dev/null 2>&1` ]]
do
echo -n "."
done
然而,添加此重定向似乎会破坏检测,并且无论 XFCE 是否正在运行,它都只是在那里打印点。
我已经单独测试了这两个命令,并在它们自己的 shell 脚本中测试了它们,它们都按我的预期工作,当 XFCE 未运行时返回 1,当 XFCE 运行时返回 0。
任何人都可以解释为什么将该命令放入 [[ ! `…` ]]
打破了 while
测试以及我如何重写它 while
循环正确吗?
(在拱门上运行)
解决方案
问题是你没有测试返回码 xset
无论如何,你处理它的输出。当您将输出重定向到 /dev/null
, ,反引号中的表达式不会返回任何内容,就好像您有:
while [[ ! '' ]] ...
这将始终运行 while
身体。
你应该做的是:
while ! xset q > /dev/null 2>&1
do
...
done
不隶属于 StackOverflow