我的 zsh shell 中有这个烦人的问题,其中在某处声明了一个函数,并且该函数被命名为“cp”,因此它覆盖了正常的 cp 行为。我试图找到函数声明,但我不能。我已经查看了 .zshrc 的正常位置以及 .zshrc 中包含的各种其他来源,但到目前为止还没有。
我尝试过的其他事情:
grep -r 'function cp' .
(来自~)whence -f cp
(给出函数定义,但不给出它的声明位置)有任何想法吗?
小智 38
我今天需要这样做,发现whence -v
输出包含函数定义的文件。
$ whence -v function_name
function_name is a shell function from /path/to/file
Run Code Online (Sandbox Code Playgroud)
小智 8
较新版本的 zsh(自 5.4 起,在 commit 中添加34f70c5
)支持将$functions_source
数组作为模块的一部分zsh/parameter
(文档man zshmodules
:):
\n\n\n
functions_source
此只读关联数组将已启用函数的名称映射到包含函数源的文件的名称。
\n对于已加载的自动加载函数,或使用绝对路径标记为自动加载,或已使用 \xe2\x80\x98 \xe2\x80
\nfunctions -r
\x99 解析其路径的自动加载函数,这是为自动加载找到的文件,解析为绝对路径。对于在脚本或源文件主体中定义的函数,这是该文件的名称。在本例中,这是该文件最初使用的确切路径,可能是相对路径。
\n对于任何其他函数,包括在交互式提示中定义的任何函数或路径尚未解析的自动加载函数,这是空字符串。然而,只要该函数存在,散列元素就会被报告为已定义:该散列的键与 的键相同
\n$functions
。
所以,你可以做
\necho $functions_source[cp]\n
Run Code Online (Sandbox Code Playgroud)\n
首先,可以在没有function
关键字的情况下定义函数,以便更好的搜索
grep 'cp()' .*
Run Code Online (Sandbox Code Playgroud)
这将搜索诸如.zshrc
和之类的文件.profile
。如果没有发现任何内容,您可能还想查看zsh
. 这些在最后列出man zsh
:
FILES
$ZDOTDIR/.zshenv
$ZDOTDIR/.zprofile
$ZDOTDIR/.zshrc
$ZDOTDIR/.zlogin
$ZDOTDIR/.zlogout
${TMPPREFIX}* (default is /tmp/zsh*)
/etc/zsh/zshenv
/etc/zsh/zprofile
/etc/zsh/zshrc
/etc/zsh/zlogin
/etc/zsh/zlogout (installation-specific - /etc is the default)
Run Code Online (Sandbox Code Playgroud)
默认情况下$ZDOTDIR
应该是您的$HOME
. 所以,这个命令应该找到你的违规文件:
grep 'cp()\|cp ()' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin /etc/zsh/zshenv \
/etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin
Run Code Online (Sandbox Code Playgroud)
我添加了\|
因为你也可以在函数名和函数本身之间有空格。最后,@Dennis 指出,如果使用function
关键字,也可以省略括号。因此,为了更加安全,请执行以下操作:
grep -E 'function cp|cp *\(\)' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin \
/etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3514 次 |
最近记录: |