Tänk på nedanstående generiska kodavsnitt:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
Här, $? är inställd på utgångsstatus för cmd1 . Utgångsstatus för cmd2 är förlorad.
I ditt fall, sqlplus råkar vara cmd2. Så, utgångsstatusen för det kommandot fångas inte i $? .
Du kan prova detta;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
> [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0
Observera att om cmd1 är en komplex struktur (som while read t.ex.) allt du kör i att medan loop kommer att köras i ett subshell och alla miljöer (variabler/pwd) som ändras kommer att gå förlorade.