Comando reatribuído

Comando reatribuído

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 echoerrpara 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 zshpermite 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-filedeve abrir seu editor.

informação relacionada