Localizando a origem de uma função no zsh

5

Eu tenho esse problema chato no meu shell zsh, onde uma função está sendo declarada em algum lugar e essa função é chamada "cp", então está substituindo o comportamento normal do cp. Eu estou tentando localizar a declaração de função, mas não posso. Eu já olhei nos lugares normais de .zshrc e nas várias outras fontes que estão sendo incluídas no .zshrc mas até agora nada.

Outras coisas que eu tentei:

  • grep -r 'function cp' . (de ~)
  • whence -f cp (fornece a definição da função, mas não de onde ela é declarada)

Alguma idéia?

    
por asolberg 26.01.2014 / 22:26

3 respostas

3

Em primeiro lugar, uma função pode ser definida sem a palavra-chave function , portanto, uma pesquisa melhor seria

grep 'cp()' .*

Isso pesquisará arquivos como .zshrc e .profile e outros. Se isso não encontrar nada, você também pode querer ver os vários arquivos carregados por zsh . Eles estão listados no final de man zsh :

FILES
       $ZDOTDIR/.zshenv
       $ZDOTDIR/.zprofile
       $ZDOTDIR/.zshrc
       $ZDOTDIR/.zlogin
       $ZDOTDIR/.zlogout
       ${TMPPREFIX}*   (default is /tmp/zsh*)
       /etc/zsh/zshenv
       /etc/zsh/zprofile
       /etc/zsh/zshrc
       /etc/zsh/zlogin
       /etc/zsh/zlogout    (installation-specific - /etc is the default)

Por padrão, $ZDOTDIR deve ser seu $HOME . Então, este comando deve encontrar seu arquivo ofensivo:

grep 'cp()\|cp ()' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin /etc/zsh/zshenv \
 /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin 

Eu adicionei o \| , já que você também pode ter espaços entre o nome da função e a própria função. Finalmente, @Dennis aponta que os parênteses também podem ser omitidos se você usar a palavra-chave function . Então, para ser ainda mais seguro, faça isso:

grep -E 'function cp|cp *\(\)' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin \
  /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin 
    
por 26.01.2014 / 22:55
11

Eu precisava fazer isso hoje e descobri que whence -v exibe o arquivo que contém a definição da função.

$ whence -v function_name
function_name is a shell function from /path/to/file
    
por 26.12.2015 / 23:02
0

A resposta de Terdon já forneceu o comando grep apropriado para capturar todas as variantes possíveis de uma definição de função.

Eu quero adicionar mais dois pontos.

  1. Para obter uma lista de arquivos, que são realmente lidos (por exemplo, um arquivo não padrão pode ser originado por outro arquivo!), você pode invocar zsh com a opção SOURCE_TRACE ativado:

    $ zsh -o sourcetrace
    +/etc/zshenv:1> <sourcetrace>
    +/home/user/.zshrc:1> <sourcetrace>
    +/home/user/.zcompdump:1> <sourcetrace>
    +/home/user/.zshrc-last:1> <sourcetrace>
    
  2. Com isso, grep-approach '' você não vai pegar funções que são autoloaded via autoload builtin. Então, verifique também seu fpath :

    $ for i ($fpath) { ls -l "$i"/cp }
    
por 27.01.2014 / 11:33

Tags