我正在编写一个使用 Xvfb 启动虚拟帧缓冲区的脚本。我想确保命令成功,但我不希望脚本等到命令完成,因为 Xvfb 会继续运行,直到 X 服务器被终止。例如:
if ! Xvfb $DISPLAY &; then
echo 'Error: failed to create virtual frame buffer'
exit 1
fi
xpid=$!
# do stuff that uses frame buffer
kill $xpid
问题是它会引发语法错误&;
:
$ stuff.sh
stuff.sh: line 149: syntax error near unexpected token `;'
stuff.sh: line 149: `if ! Xvfb $DISPLAY &; then'
我尝试将该行更改为,if ! Xvfb $DISPLAY & ;
但它仍然引发错误。
答案1
符号&
是 a control operator
,结束要测试的命令列表。根据该定义,以下内容是免费的句法错误:
if ! Xvfb $DISPLAY & then
echo 'Error: failed to create virtual frame buffer'
exit 1
fi
问题是,通过后台命令Xvfb
,测试结果将总是为零/真。
我会启动该过程,然后等待足够长的时间直到它消失,然后检查它是否仍然存在:
Xvfb $DISPLAY &
xvfbpid=$!
sleep 3 ## adjust to taste
if ! ps -p $xvfbpid > /dev/null
then
echo 'Error: failed to create virtual frame buffer'
exit 1
fi
参考:
- Open Group 基本规范第 7 期,2018 年版: Shell 和实用程序 - Shell 命令语言 - Shell 命令 - 列表 - 异步列表 - 退出状态