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



我在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

当然,它有点啰嗦,但也很容易理解。你想要的是会让你挠头和困惑的代码。

相关内容

最新更新