I have a script something like this:
go build foo -o /tmp/foo \
&& echo 'Compressing foo' \
&& upx /tmp/foo \
|| exit 11 & 
#  ^ this exit didn't exit the caller script
go build bar -o /tmp/bar \
&& echo 'Compressing bar' \
&& upx /tmp/bar \
|| exit 12 & 
go build baz -o /tmp/baz \
&& echo 'Compressing baz' \
&& upx /tmp/baz \
|| exit 13 & 
wait
scp /tmp/foo /tmp/bar /tmp/baz someuser@someserver:/tmp
How to make it exit when one of the background command either foo, bar or baz failed?
EDIT: Solution from the reference above:
PIDS=''
go build foo -o /tmp/foo \
&& echo 'Compressing foo' \
&& upx /tmp/foo & 
PIDS="$PIDS $!"
go build bar -o /tmp/bar \
&& echo 'Compressing bar' \
&& upx /tmp/bar & 
PIDS="$PIDS $!"
go build baz -o /tmp/baz \
&& echo 'Compressing baz' \
&& upx /tmp/baz  & 
PIDS="$PIDS $!"
for pid in $PIDS; do
    wait $pid || let 'fail=1'
done
if [ "$fail" == '1' ]; then
    exit 11
fi
scp /tmp/foo /tmp/bar /tmp/baz someuser@someserver:/tmp
