
Encontrei um trecho de script Bash anteriormente para fazer eco de uma string para stderr:
echoerr() { echo "$@" 1>&2; }
echoerr hello world
Isso permaneceu na minha área de transferência e, quando quis editar um arquivo (com VIM), colei acidentalmente este trecho novamente em vez do nome do arquivo:
vim echoerr() { echo "$@" 1>&2; }
echoerr hello world
Parece ter sido reatribuído echoerr
para vim
:
$ where vim
vim () {
echo "$@" 1>&2;
}
/usr/bin/vim
Além disso, tentar abrir um arquivo com VIM agora apenas ecoa o nome do arquivo de volta:
vim path/to/some-file
Impressões:
path/to/some-file
O que aconteceu?(Estou executando o zsh dentro do tmux)
Responder1
Porque zsh
permite definir funções com vários nomes. De 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'.
Responder2
Você conseguiu criar uma função chamada vim()
. Isso é possível porque o zsh permite criar uma única função com mais de um nome ao mesmo tempo
% vim dud() { echo ran dud function }
% dud
ran dud function
% vim path/to/some-file
ran dud function
Observe como vim()
e dud()
ambos foram definidos como funções.
Você pode eliminar o erro desativando a função def da seguinte forma:
% unset -f vim
Agora vim path/to/some-file
deve abrir seu editor.