$PIPESTATUS
O código de saída de cada elo do cano, não só do último.
Num pipeline, $? só enxerga o último elo — grep x arquivo | sort devolve 0 mesmo com o grep de mãos vazias. PIPESTATUS é o array com o código de cada elo, na ordem.
É volátil como poucos: qualquer comando seguinte o substitui, então copie primeiro — ecos=("${PIPESTATUS[@]}"). No zsh o mesmo fantasma atende por pipestatus, em minúsculas.
$ grep rainha vazio.txt | sort
$ echo "${PIPESTATUS[@]}"
1 0