verifyfirst

A command's return status · collector-discards-child-status · documented

wait without arguments returns zero however its children exited

NS-053 documentedcollector-discards-child-status

wait without arguments returns zero however its children exited

reads as
A script starts several jobs with `&`, calls `wait`, and exits zero. Conclusion drawn: every job succeeded.
actually
The bash manual is explicit: 'If id is not given, wait waits for all running background jobs and the last-executed process substitution, if its process id is the same as $!, and the return status is zero.' The children's statuses are reaped and discarded. Any number of them may have failed.
blind because
An exit code reports what the last command chose to return, and bare wait returns zero by specification. The failing work happened in processes whose status was never requested.
the check
Wait on each recorded PID and keep the statuses: `rc=0; for p in "${pids[@]}"; do wait "$p" || rc=$?; done; exit $rc`. Observed on bash 5.2.21 with one child exiting 3 and another exiting 7: bare `wait` returned 0, `wait $pid` on the second returned 7, and `wait -n` returned the status of the first job to finish.
cost of missing
Parallelism converts a failing step into a silent one. A fan-out of uploads, migrations or builds reports success while an arbitrary subset of it did not happen.
generalises to
Every aggregator that reduces many statuses to one: parallel test runners, job schedulers, batch APIs, fan-out without per-item bookkeeping.
source
gnu.org

Reported as

Others this instrument misses

plain text · full registry