我正在尝试编写脚本以在自己的x session 中启动xfce和xbmc。

为此,我要设置DISPLAY值,在后台运行第一个值,然后等待直到从xset q成功返回为止。然后,我更改DISPLAY并为另一个做相同的事情。

我正在逐段编写代码,以检查每个部分的语法是否正确,而我停留的部分是“等待直到我从xset q成功返回为止。

export DISPLAY=":0.0"
while [[ ! `xset q` ]]
do
  echo -n "."
done

该代码似乎可以正常工作,因此当XFCE运行时,它会立即退出,而当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循环?

(在Arch上运行)

最佳答案

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

while [[ ! '' ]] ...

它将始终运行while主体。

您应该做的是:
while ! xset q > /dev/null 2>&1
do
  ...
done

10-08 12:54