PROMPT_COMMAND実行中にPIPESTATUSを確認するには?

PROMPT_COMMAND実行中にPIPESTATUSを確認するには?

$PROMPT_COMMANDbashには、最後に実行されたコマンドと対応する戻りコードを記録するカスタムプログラムがあります。$?パイプ命令では十分ではないことに気づくまで、後者を幸せに使用しました。私は${PIPESTATUS[@]}それを文書化する必要があると思いました。

残念ながら$PIPESTATUSすでに設定されているようです後ろに呼ぶ$PROMPT_COMMAND。お持ちですか?いたずら実行中にこの情報にアクセスするために使用できますか$PROMPT_COMMAND

答え1

コマンド機能はプロンプトコマンドで変更され、PIPESTATUSプロンプトコマンドの後にbash保存および復元(および)PIPESTATUSされます。参考$?ここで予想される動作の説明があります。

秘密は、次の場所に保存$PIPESTATUS[](および/または$?)することです。最初の声明関数の値。それ以降は元の値を上書きします。

function myprompt() {
   _pipestatus=( "${PIPESTATUS[@]}" )
   echo "current: ${PIPESTATUS[@]}"
   echo "cached : ${_pipestatus[@]}"
}

PROMPT_COMMAND=myprompt

それから:

$ true | false | true
current: 0
cached : 0 1 0

説明したのと同様の操作を行いましたが、ERRプロンプトコマンドの代わりにトラップハンドラ機能を使用しました。

答え2

まあ、おそらくbashのバージョンによって異なるかもしれません。

Bash プロファイル設定で次の簡単な割り当てを試してみましょう。

PROMPT_COMMAND="エコーステータス=$?"エクスポート

bash 4.1.2はうまく動作します。 Bashプロンプトで存在しないコマンドを入力しました。

ステータス=127

bash 3.2.25は常に印刷されます。

ステータス=0

コマンドラインで変数を確認します。

エコ $PROMPT_COMMAND

ワーカーホストは私の仕事に対応しています。他のホストでは、その値は次のようになります。

履歴記録-a;履歴記録-n;エコ状態=$?

なぜこれらのコマンドがありますか?彼らは問題の原因ですか?

関連情報