2017-02-14 9 views
0

Я следующий код в Баш скрипт:Правильный способ получения возвращаемого значения ожидания <pid> команды

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

ответ

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 
+0

Зачем вам нужно '{}' around 'printf'? – Inian

+0

@GrishaLevit - спасибо, что указали это. Обновлен ответ. – codeforester

2

Если вы действительно хотите быть более кратким, вы могли бы сделать так:

wait $job || { 
    echo "$job failed with code $?" 
    EXIT_CODE=1 
} 

Side Примечание: 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 
+0

Поздравления. Ваша сторона примечания еще важнее, чем оригинальная проблема. – linuxfan

+0

Если между вызовами 'wait -n' выполняется несколько заданий, вы можете пропустить неудачное задание. – chepner

1

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

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

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

+0

Да, я не знал, что вы можете это сделать, со статусом = $? в следующей строке после вызова ожидания, фиксируя результат вызова ожидания –