我之前发现了一个 Bash 脚本片段,用于将字符串回显到 stderr:
echoerr() { echo "$@" 1>&2; }
echoerr hello world
这仍然在我的剪贴板中,当我想编辑文件(使用 VIM)时,我不小心再次粘贴了这个片段而不是文件名:
vim echoerr() { echo "$@" 1>&2; }
echoerr hello world
它似乎已重新分配echoerr
给vim
:
$ where vim
vim () {
echo "$@" 1>&2;
}
/usr/bin/vim
另外,尝试使用 VIM 打开文件现在只会回显文件名:
vim path/to/some-file
印刷:
path/to/some-file
发生了什么?(我在 tmux 内运行 zsh)
答案1
因为zsh
允许您定义具有多个名称的函数。从man zshmisc
:
function word ... [ () ] [ term ] { list }
word ... () [ term ] { list }
word ... () [ term ] command
where term is one or more newline or ;. Define a function which
is referenced by any one of word. Normally, only one word is
provided; multiple words are usually only useful for setting
traps. The body of the function is the list between the { and
}. See the section `Functions'.
答案2
您已经成功创建了一个名为 的函数vim()
。这是可能的,因为 zsh 允许您同时创建具有多个名称的单个函数
% vim dud() { echo ran dud function }
% dud
ran dud function
% vim path/to/some-file
ran dud function
请注意如何将vim()
和dud()
两者设置为函数。
您可以通过取消设置它的函数 def 来杀死错误的函数,如下所示:
% unset -f vim
现在vim path/to/some-file
应该打开你的编辑器。