Rozważ poniższy ogólny fragment:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
Tutaj, $?
jest ustawiony na status wyjścia cmd1
. Status wyjścia cmd2
jest zgubiony.
W twoim przypadku sqlplus
tak się składa, że jest to cmd2. Tak więc status wyjścia tego polecenia nie jest przechwycony w $?
.
Możesz tego spróbować;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
> [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0
Zauważ, że jeśli cmd1
jest złożoną strukturą (jak while read
np. każda rzecz, którą uruchomisz, podczas gdy pętla zostanie uruchomiona w podpowłoce, a każde zmienione środowisko (zmienne/pwd) zostanie utracone.