パイプを介して接続された2つのプロセスfoo
があります。bar
$ foo | bar
bar
常に0で終了します。終了コードに興味がありますfoo
。それを得る方法はありますか?
ベストアンサー1
bash
また、zsh
シェルが実行した最後のパイプラインの各要素(コマンド)の終了状態を保持する配列変数があります。
を使用すると、配列がbash
呼び出されPIPESTATUS
(大文字と小文字が区別されます)、配列インデックスは0から始まります。
$ false | true
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
1 0
を使用すると、配列がzsh
呼び出されpipestatus
(大文字と小文字が区別されます)、配列インデックスは1から始まります。
$ false | true
$ echo "${pipestatus[1]} ${pipestatus[2]}"
1 0
値を失うことなく関数から結合するには、次のようにします。
$ false | true
$ retval_bash="${PIPESTATUS[0]}" retval_zsh="${pipestatus[1]}" retval_final=$?
$ echo $retval_bash $retval_zsh $retval_final
1 0
bash
上記のコードを or で実行すると、and の 1 つだけをzsh
設定すると同じ結果が得られますretval_bash
。retval_zsh
もう一つは空です。これにより、関数は次のようになりますreturn $retval_bash $retval_zsh
(引用符がないことに注意してください!)。