Você pode obter facilmente o retorno de qualquer processo subescavado, ecoando seu retorno sobre sua stdout. O mesmo acontece com a substituição do processo:
while IFS= read -r -d $'echo "$return"
' FILE ||
! return=$FILE
do ARGS[ARGID++]="$FILE"
done < <(find . -type f -print0; printf "$?")
Se eu executar isso, a última linha - (ou a seção
delimitada conforme o caso) será o status de retorno de find
read
. $return
retornará 1 quando receber um EOF - assim, a única vez em que $FILE
é definido como printf
é para o último bit de informação lido.
Eu uso \n
para não adicionar um extra read
ewline - isso é importante porque até mesmo um
executado regularmente - um no qual você não delimita \n
\n
NULs - retornará diferente de 0 nos casos em que os dados que acabou de ler não terminam em $FILE
ewline. Portanto, se sua última linha não terminar com || ! return=...
ewline, o último valor em sua variável de leitura será seu retorno.
Comando de execução acima e depois:
0
OUTPUT
...
done < <(! find . -type f -print0; printf "$?")
echo "$return"
E se eu alterar a parte de substituição do processo ...
1
OUTPUT
printf \n%s list of lines printed to pipe |
while read v || ! echo "$v"
do :; done
Uma demonstração mais simples:
pipe
OUTPUT
while IFS= read -r -d $'echo "$return"
' FILE ||
! return=$FILE
do ARGS[ARGID++]="$FILE"
done < <(find . -type f -print0; printf "$?")
E, na verdade, desde que o retorno desejado seja a última coisa que você escreve para stdout dentro da substituição do processo - ou qualquer processo subescavado do qual você lê dessa maneira - então %code% sempre será o status de retorno que você quer quando terminar. E assim, a parte %code% não é estritamente necessária - é usada para demonstrar apenas o conceito.