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.