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