Zvažte níže obecný úryvek:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
Tady, $? je nastaven na ukončovací stav cmd1 . Stav ukončení cmd2 je ztraceno.
Ve vašem případě sqlplus náhodou je to cmd2. Takže stav ukončení tohoto příkazu není zachycen v $? .
Můžete zkusit toto;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
> [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0
Všimněte si, že pokud cmd1 je složitá struktura (jako while read např.) cokoli, co spustíte v této smyčce while, bude spuštěno v subshell a jakékoli změněné prostředí (proměnné/pwd) bude ztraceno.