我在bash脚本中有以下代码:
for job in `jobs -p`; do
echo "PID => ${job}"
if ! wait ${job} ; then
echo "At least one test failed with exit code => $?" ;
EXIT_CODE=1;
fi
done
wait <pid>
,在这种情况下,wait ${job}
应该返回退出代码,但我不知道如何获取/查看值。我需要做的是将上面的脚本更改为这样的内容:
for job in `jobs -p`; do
echo "PID => ${job}"
CODE=0;
wait ${job} || CODE=$?
if ! ${CODE} ; then
echo "At least one test failed with exit code => ${CODE}" ;
EXIT_CODE=1;
fi
done
有没有一种更干净、不那么冗长的方法可以做到这一点?除了使用我刚刚使用的技术之外,我对如何从wait <pid>
中检索"返回值"感到困惑。有没有其他方法可以做到这一点?
如果你真的想更简洁,你可以这样做:
wait $job || {
echo "$job failed with code $?"
EXIT_CODE=1
}
旁注:for job in $(jobs -p); do
可能不是最好的主意。 当循环开始时,作业列表会展开,但作业可能会在循环运行时完成(例如,当您等待列表中的第一个作业时,第二个作业完成(。
相反,您可以执行以下操作:
while :; do
wait -n && continue # wait for any job to finish
code=$?
((code==127)) && break # no jobs found to wait for
echo "A test failed with code $code"
done
这个怎么样:
declare -A failures
for job in `jobs -p`; do
wait "$job" || ((failures[$job] = $?))
done
if (( "${#failures[@]}" > 0 )); then
# traverse the hash and print which processes failed, along with exit code
fi
更干净?还有什么比最明显和最直接的方式更干净:
wait $job
status=$?
if (( $status != 0 )); then
...
fi
当然,它有点啰嗦,但也很容易理解。你不想要的是会让你挠头和困惑的代码。