コマンドを実行した後、Zshはprecmdを実行します。

コマンドを実行した後、Zshはprecmdを実行します。

何らかの理由でzshがprecmd実行されます。後ろにそれより先に注文を…?

[user@main ~/workspace]$ cat ~/workspace/precmd.sh
echo "Command should start after this line, but it will not"
[user@main ~/workspace]$ precmd () { ~/workspace/precmd.sh }
[user@main ~/workspace]$ command -v vim
/usr/bin/vim
Command should start after this line, but it will not

私はzshrcで試してみましたが、trap '/home/user/workspace/precmd.sh' DEBUGそれも機能しません。

答え1

関数名が少し誤解を招く可能性がありますが、これが意味するところです。

precmd各プロンプトの前に実行します。類似²bash$PROMPT_COMMAND

からinfo zsh precmd

precmd

各プロンプトの前に実行します。たとえば、既存のジョブに関する通知が表示されたときに発生するコマンドラインが再描画されても、事前コマンド機能は再実行されません。

DEBUG各コマンドの前に何が起こるのか、トラップ3を参照してください。

プロンプトで入力したコード(を押した後Enter)が解釈される前に実行される操作については、preexecフック機能を参照してください。

prompt$ precmd() echo precmd; preexec() print -r preexec $1; TRAPDEBUG() print -r debug $ZSH_DEBUG_CMD
debug echo precmd
precmd
prompt$ echo 1; echo 2; echo 3
debug print -r preexec $1
preexec echo 1; echo 2; echo 3
debug echo 1
1
debug echo 2
2
debug echo 3
3
debug echo precmd
precmd
prompt$ 

debugbeforecmdDEBUGトラップがコマンドの前(デフォルト)以降に実行されるかどうかを決定するオプションも参照してください。

precmd/関数を設定する代わりに、独自の関数を定義してその/配列に追加することもできます(トラップにはその項目はありません)。preexecprecmd_functionspreexec_functions

myhook() echo myhook
precmd_functions+=(myhook)

また、見ることができますzsh-add-hook


1名前は、初期変更ログに基づいて1983年頃にKarl Kleinpasteによって追加された同様の機能を持つ名前precmdから派生しました。tcshzshの元の1.0バージョンはprecmd1990年初頭にリリースされました。

²開発の初期に追加されましたbash。 1989 1.02にはすでに存在していました。

³ 1980年代のコーンシェル。また、1990年のzshの最初のバージョンでも同様です。

関連情報