Comando designado novamente

5

Eu encontrei um trecho de script Bash anterior com o qual fazer o eco de uma string para stderr:

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

Isso permaneceu na minha área de transferência e, quando eu quis editar um arquivo (com o VIM), colei acidentalmente esse snippet novamente, em vez do nome do arquivo:

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

Parece que foi atribuído novamente echoerr a vim :

$ where vim
vim () {
    echo "$@" 1>&2;
}
/usr/bin/vim

Além disso, tentar abrir um arquivo com o VIM agora apenas exibe o nome do arquivo:

vim path/to/some-file

Impressões:

path/to/some-file

O que aconteceu? (estou rodando zsh dentro do tmux)

    
por opyate 14.06.2014 / 11:31

2 respostas

5

Porque zsh permite que você defina 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'.
    
por 14.06.2014 / 12:19
4

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() foram definidos como funções.

Você pode matar o erro errado, desativando a função def da seguinte forma:

% unset -f vim

Agora vim path/to/some-file deve abrir seu editor.

    
por 14.06.2014 / 12:27

Tags