运行命令后,Zsh 运行 precmd

运行命令后,Zsh 运行 precmd

由于某种原因,zshprecmd运行命令而不是在它们之前......?

[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

我尝试trap '/home/user/workspace/precmd.sh' DEBUG在我的 zshrc 中使用,但这也不起作用。

答案1

这就是它的含义,即使函数的名称可能有点误导。

precmd在每个提示之前执行。类似于bash$PROMPT_COMMAND²

info zsh precmd

precmd

在每个提示之前执行。请注意,预命令函数不会仅仅因为重新绘制命令行而重新执行,例如,当显示有关现有作业的通知时就会发生这种情况。

有关每个命令之前执行的操作,请参阅DEBUGtrap3。

对于在开始解释您在提示符下输入的代码(按 后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$ 

另请参阅debugbeforecmd决定 DEBUG 陷阱是在命令之前(默认)还是之后运行的选项。

您还可以定义自己的函数并将其添加到相应的/数组中(陷阱没有等效项),而不是设置precmd/函数:preexecprecmd_functionspreexec_functions

myhook() echo myhook
precmd_functions+=(myhook)

也可以看看zsh-add-hook


1 该precmd名称源自tcsh具有类似功能的名称,由 Karl Kleinpaste 根据早期变更日志于 1983 年左右添加。 zshprecmd早在 1990 年就发布了最初的 1.0 版本。

² 在开发初期就添加了bash。 1989 年 1.02 就已经存在了

³ 来自 80 年代的 Korn shell。也在 1990 年的 zsh 第一个版本中。

相关内容