以下の一般的なスニペットを検討してください:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
ここで、$?
cmd1
の終了ステータスに設定されます 。 cmd2
の終了ステータス 失われます。
あなたの場合、sqlplus
たまたまcmd2です。したがって、そのコマンドの終了ステータスは$?
にキャプチャされません。 。
これを試すことができます;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
> [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0
cmd1
の場合は注意してください 複雑な構造です(while read
など 例)whileループで実行したものはすべてサブシェルで実行され、変更された環境(変数/ pwd)はすべて失われます。