在 zsh 中,precmd_functions 在哪里定义?

use*_*622 3 zsh function

如果在 zsh 中,我输入set并查看precmd_functions=(_precmd_function_dostuff _precmd_function_domore).

在哪里_precmd_function_dostuff_precmd_function_domore定义(即它们是在文件中定义的?哪个文件?)?

我可以输入functions以查看_precmd_function_dostuffand的定义_precmd_function_domore,但这并没有告诉我它们的定义位置。

Sté*_*las 5

在 zsh 5.3 或更高版本中,

type _precmd_function_domore
Run Code Online (Sandbox Code Playgroud)

应该返回类似的东西

_precmd_function_domore is a shell function from /usr/local/etc/zshrc.d/80-PetaLinux
Run Code Online (Sandbox Code Playgroud)

使用zsh5.4 或更高版本,您还可以使用:

echo $functions_source[_precmd_function_domore]
Run Code Online (Sandbox Code Playgroud)

当您zsh使用该xtrace选项(如 with zsh -x)运行时,它会在 stderr 上写入调试信息,显示它运行的每个命令(尽管不是函数定义)。您可以修改$PS4变量(用于xtrace输出的提示变量,请参阅参考资料info zsh PS4),以便它为您提供更多信息,例如它运行的每个命令、从哪个文件读取命令以及在每一行上读取该命令。

PS4='+%x:%I> ' zsh -x 2> >(grep precmd_func)
Run Code Online (Sandbox Code Playgroud)

将运行一个新的 zsh 交互式 shell 实例,stderr 由 grep 过滤以显示包含precmd_func.

或者使用zsh,您可以_precmd_function_domore在下xtrace和使用%x:%I中调用该函数$PS4以查看函数定义的读取位置:

$ grep -n precmd ~/.zshrc
192:precmd_foo() echo foo
$ (PS4='+%x:%I> '; set -x; precmd_foo)
+zsh:2> precmd_foo
+/home/stephane/.zshrc:194> echo foo
foo
Run Code Online (Sandbox Code Playgroud)

(不过请注意这里的两行数)。