由于某种原因,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
Run Code Online (Sandbox Code Playgroud)
我尝试trap '/home/user/workspace/precmd.sh' DEBUG在我的 zshrc 中使用,但这也不起作用。
这就是它的意思,即使函数的名称 xc2xb9 可能有点误导。
\nprecmd在每个提示之前执行。类似于\ bashxc2 $PROMPT_COMMAND\xb2
从info zsh precmd:
\n\n\n
precmd在每个提示之前执行。请注意,预命令函数不会被重新执行,\n只是因为命令行被重绘,\n例如,当显示有关退出作业的通知时\n就会发生这种情况。
\n
有关每个命令之前执行的内容,请参阅DEBUGtrap\xc2\xb3。
对于在开始解释您在提示符下输入的代码(按 后Enter)之前执行的操作,请参阅preexec挂钩函数。
prompt$ precmd() echo precmd; preexec() print -r preexec $1; TRAPDEBUG() print -r debug $ZSH_DEBUG_CMD\ndebug echo precmd\nprecmd\nprompt$ echo 1; echo 2; echo 3\ndebug print -r preexec $1\npreexec echo 1; echo 2; echo 3\ndebug echo 1\n1\ndebug echo 2\n2\ndebug echo 3\n3\ndebug echo precmd\nprecmd\nprompt$ \nRun Code Online (Sandbox Code Playgroud)\n另请参阅debugbeforecmd决定 DEBUG 陷阱是在命令之前(默认)还是之后运行的选项。
除了设置precmd/preexec函数之外,您还可以定义自己的函数并将其添加到相应的precmd_functions/preexec_functions数组中(陷阱没有等效项):
myhook() echo myhook\nprecmd_functions+=(myhook)\nRun Code Online (Sandbox Code Playgroud)\n也可以看看zsh-add-hook
\xc2\xb9 这个precmd名字来源于tcsh它具有类似的功能,根据早期的变更日志,Karl Kleinpaste 于 1983 年左右添加了该功能。zshprecmd早在 1990 年就发布了最初的 1.0 版本。
\xc2\xb2 在开发初期就添加到了那里bash。1989 年 1.02 就已经存在了
\xc2\xb3 来自 80 年代的 Korn shell。也在 1990 年的 zsh 第一个版本中。
\n