Considere abaixo o trecho genérico:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
Aqui,
$?
está definido para o status de saída de cmd1
. O status de saída de cmd2
está perdido. No seu caso,
sqlplus
passa a ser cmd2. Portanto, o status de saída desse comando não é capturado em $?
. Você pode tentar isso;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
> [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0
Observe que se
cmd1
é uma estrutura complexa (como while read
por exemplo) qualquer coisa que você executar nesse loop while será executado em um subshell e qualquer ambiente (variáveis/pwd) alterado será perdido.