让我们把这个作为起点考虑:
我希望如果后台进程出现错误,
然而,当我的脚本中有几个这样的“同步点”和几个子进程在每个点等待时,这变得很繁琐。
我对错误代码本身并不是很感兴趣,只在意它们不成功。
是否有一种更简洁的方法使
编辑:我正在寻找一种解决方案,在此解决方案中,
#!/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
执行 echo "Done"。因为使用了 set -e
,所以我原本期望 wait
命令会退出脚本。
我知道可以保存 sleep
命令的进程ID(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
失败并退出(因为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
set -e
而退出脚本”的长异常列表,正是为什么建议你不要使用set -e
的原因。” - chepner