检索wait <pid>命令返回值的正确方法

时间:2017-02-14 05:24:38

标签: bash shell waitpid

我在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>检索“返回值”感到困惑。还有其他办法吗?

3 个答案:

答案 0 :(得分:2)

这个怎么样:

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

答案 1 :(得分:2)

如果你真的想要更简洁,你可以这样做:

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

答案 2 :(得分:1)

清洁?什么比最明显和最直接的方式更清洁:

7,000.00

当然它有点冗长,但它也很容易理解。