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
.)