重新分配命令

重新分配命令

我之前发现了一个 Bash 脚本片段,用于将字符串回显到 stderr:

echoerr() { echo "$@" 1>&2; }
echoerr hello world

这仍然在我的剪贴板中,当我想编辑文件(使用 VIM)时,我不小心再次粘贴了这个片段而不是文件名:

vim echoerr() { echo "$@" 1>&2; }
echoerr hello world

它似乎已重新分配echoerrvim

$ 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应该打开你的编辑器。

相关内容