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.