zsh precmd関数でコマンドの終了ステータスを取得するには?

zsh precmd関数でコマンドの終了ステータスを取得するには?

実行中のコマンドに関するいくつかの状況情報を追加できるように、関数と一緒にadd-zsh-hook precmdを使用します。

つまり、precmd関数への呼び出しは、前のコマンドが成功したかどうかを確認するためのパラメータや環境変数を提供しないようです。結果によって違う行動ができるという事実を知ることができて嬉しいです。

サンプル:

_after() {
  printf 'args:%s\n' "$*" # nothing
  printf 'After\n'
  # env #: nothing useful here
}

autoload -U add-zsh-hook
add-zsh-hook precmd _after

ベストアンサー1

最後のコマンドの終了ステータスは、通常とを通じてprecmdフックからアクセスできます。フックの最初のコマンドだけを検索できることを覚えておいてください。 Hookの最初の行に個人パラメータを保存することはまれではありません。$?$status$?precmd

my-precmd-hook() {
  local -i code=$?
  printf 'exit code of the previous command: %d\n' code
}

autoload -Uz add-zsh-hook
add-zsh-hook precmd my-precmd-hook

現在のドキュメントはあまり良くありませんが、そこにあります。

フック機能

次の関数では、_functions添付関数と同じ名前で配列を定義できます。これらの配列のすべての要素は、実行される関数の名前として扱われ、$?同じパラメータと同じ初期値を使用して基本関数と同じコンテキストで実行されます。

precmd各プロンプトの前に実行します。

したがって、配列のすべての関数はprecmd_functionsメインフックと同じ方法で実行されます。ドキュメントには、これがメインフックの最後のコマンドのステータスコードと明示的に明示されていませんが、暗黙的です。最後のコマンドの状態でない場合、$?precmd$?precmd$?それ文書化する必要があります。

さらに、私たちは以下を見つけました:

シェル関数は、add-zsh-hook配列から関数を追加または削除する簡単な方法を提供します。

これはprecmd、取り付けられたフックもadd-zsh-hook基本フックと同じ方法で実行されることを意味します。$?precmd

おすすめ記事