为什么重定向输出会影响bash中的测试结果?

时间:2012-09-29 09:58:41

标签: linux bash while-loop return-value archlinux

我试图编写一个脚本来在自己的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,而当它运行时返回0。

有人可以解释为什么在[[ ! `…` ]]内放置该命令会破坏while测试,以及如何正确地重写此while循环?

(在Arch上运行)

1 个答案:

答案 0 :(得分:3)

问题是你根本没有测试xset的返回代码,而是处理它的输出。当你将输出重定向到/dev/null时,反引号中的表达式不会返回任何内容,就好像你有:

while [[ ! '' ]] ...

将始终运行while正文。

你应该做的是:

while ! xset q > /dev/null 2>&1 
do 
  ...
done