Byl jsem překvapen a stálo mne to nějaký čas:
#!/bin/bash
set -o pipefail
trap '>&2 echo Chyba v $0 na řádku $LINENO: $(sed -n ${LINENO}p $0)' ERR
find . | sed -n '1p' && echo ok || echo error
find . | head -1 && echo ok || echo error
find . | head -1
Vysvětlení je například zde:
http://www.greenend.org.uk/rjk/tech/shellmistakes.html#pipeerrors
A řeší se to pomocí mispipe z balíku moreutils.
Pokud by roura byla delší než dva členy, tak by to asi šlo řešit i takto:
#!/bin/bash
set -o pipefail
(( for (( I=0; I < 4000; I++ )); do echo "a"; done) || [[ $? -eq 141 ]]) \
| ( sed 's/a/b/g' || [[ $? -eq 141 ]] ) \
| ( sed 's/b/c/g' || [[ $? -eq 141 ]] ) \
| sed '1q' || echo ${PIPESTATUS