Правильный способ получить возвращаемое значение команды wait <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>Кроме того, используя технику, которую я только что использовал. Есть ли другой способ сделать это?

3 ответа

Как насчет этого:

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 || {
   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

Очиститель? Что может быть чище, чем самый очевидный и простой способ:

wait $job
status=$?
if (( $status != 0 )); then
    ...
fi

Конечно, это немного многословно, но это также легко понять. То, что вы не хотите, это код, который заставит вас почесать голову и запутаться.

Другие вопросы по тегам