Depois de executar mdfind ... | xargs cp ... , o código de erro em $? é o de xargs , pois é o último comando no pipeline. xargs retorna 123 se algum comando executado falhar, mas se mdfind não produzir nenhuma saída, então xargs não fará nada, então também não falhará.
No entanto, no Bash, você pode encontrar os códigos de saída de todos os comandos no último pipeline na variável de matriz % código%. O código de saída do primeiro comando é PIPESTATUS etc.
$ false | true | xargs false
$ echo "${PIPESTATUS[*]}"
1 0 123
Portanto, em vez de usar ${PIPESTATUS[0]} , que lhe dá o status de saída de $? , você pode usar xargs dando a você o status de saída de ${PIPESTATUS[0]} . Ou salve o lote para outra variável e teste os dois. ( mdfind )
Como alternativa, use saved=("${PIPESTATUS[@]}") para que set -o pipefail forneça o código de saída do último comando com falha do pipeline, se algum deles falhar. ( $? resultaria em false | true .)