Considera di seguito lo snippet generico:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
Qui, $? è impostato sullo stato di uscita di cmd1 . Lo stato di uscita di cmd2 è perso.
Nel tuo caso, sqlplus sembra essere cmd2. Quindi, lo stato di uscita di quel comando non viene acquisito in $? .
Potresti provare questo;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
> [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0
Nota che se cmd1 è una struttura complessa (come while read ad es.) qualsiasi cosa eseguita in quel ciclo while verrà eseguita in una subshell e qualsiasi ambiente (variabile/pwd) modificato andrà perso.