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.