【发布时间】:2018-09-05 21:20:16
【问题描述】:
让我们以此为起点:
#!/bin/bash
set -e
echo "Sleeping..."
sleep 2 &
wait
echo "Done"
exit 0
如果后台进程因错误退出,我希望wait 退出整个脚本。引入这样的错误:
#!/bin/bash
set -e
echo "Sleeping..."
sleep SOMETHING_STRANGE_AND_WRONG &
wait
echo "Done"
exit 0
会回显“完成”。我期待wait 退出脚本,因为set -e。
我知道可以保存sleep的pid,这样查看后台进程的返回值:
#!/bin/bash
set -e
echo "Sleeping..."
sleep SOMETHING_STRANGE_AND_WRONG &
pid=$!
if wait $pid; then
echo "Success"
else
echo "Failure!"
exit 1
fi
echo "Done"
exit 0
但是,当我的脚本中有多个这样的“同步点”时,这会变得很麻烦,并且每个点都有多个子进程要等待。
我对错误代码本身不是很感兴趣,只是它们没有成功。
如果wait 等待的任何子进程未成功,是否有更简洁的方法使wait 失败并退出(因为set -e)?
编辑:我正在寻找wait 失败并在任何子进程失败时退出的解决方案:
#!/bin/bash
set -e
echo "Sleeping..."
sleep SOMETHING_STRANGE_AND_WRONG &
sleep 2 &
wait
echo "Done"
exit 0
我目前以这种方式解决(我觉得很麻烦):
#!/bin/bash
set -e
echo "Sleeping..."
pids=""
sleep SOMETHING_STRANGE_AND_WRONG &
pids+=" $!"
sleep 2 &
pids+=" $!"
for p in $pids; do
if wait $p; then
echo "Success"
else
echo "Failure"
exit 1
fi
done
echo "Done"
exit 0
【问题讨论】:
-
“我期待 [foo] 退出脚本,因为
set -e”的一长串例外是建议您不要使用@的原因987654336@. -
请参阅BashFAQ #105 了解更多信息,如果赶时间,请跳过以下练习的寓言。