如果在 zsh 中,我输入set
并查看precmd_functions=(_precmd_function_dostuff _precmd_function_domore)
.
在哪里_precmd_function_dostuff
和_precmd_function_domore
定义(即它们是在文件中定义的?哪个文件?)?
我可以输入functions
以查看_precmd_function_dostuff
and的定义_precmd_function_domore
,但这并没有告诉我它们的定义位置。
在 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)
使用zsh
5.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)
(不过请注意这里的两行数)。