É possível verificar onde um alias foi definido?

13

Um alias, como ll , é definido com o comando alias .

Eu posso verificar o comando com coisas como type ll , que imprime

ll is aliased to 'ls -l --color=auto'

ou command -v ll que imprime

alias ll='ls -l --color=auto'

ou alias ll , que também imprime

alias ll='ls -l --color=auto'

mas não consigo encontrar onde o alias foi definido, ou seja, um arquivo como .bashrc ou talvez manualmente no shell em execução. Neste ponto, não tenho certeza se isso é possível.

Devo simplesmente percorrer todos os arquivos carregados por bash e verificar cada um deles?

    
por polemon 10.11.2016 / 23:09

6 respostas

13

A definição manual será difícil de detectar (talvez os logs do histórico), embora solicitando que o shell mostre o que está fazendo e, em seguida, grep deve ajudar a encontrar aqueles configurados em um arquivo rc:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

Se o shell não estiver capturando com precisão as opções necessárias com uma das invocações acima (que executam o comando null de forma interativa), então script :

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

Outra opção seria usar algo como strace ou sysdig para encontrar todos os arquivos que o shell toca, então vá grep manualmente (útil se o shell ou o programa não tem um -x flag); os arquivos RC padrão não são suficientes para uma verificação de nome de arquivo manual se algo como configurações de oh-my-zsh ou site-specific estiverem obtendo código de quem sabe onde (ou também pode haver variáveis de ambiente, como aponta sua resposta) .

    
por 10.11.2016 / 23:44
5

Aqui é onde eu acho grep -rl muito útil:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

informará em qual arquivo a palavra alias é usada.

Provavelmente em ~/.bashrc e certamente em ~/.bash_aliases se existir.

No entanto, é impossível ter absoluta certeza de que isso abrange todas as opções. Esses arquivos também podem chamar ou carregar outros arquivos. Uma variável de ambiente como ENV ou $BASH_ENV pode direcionar o bash para carregar alguns outros arquivos.

looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute.

E aliases podem ser definidos definindo uma variável (ênfase minha):

BASH_ALIASES
An associative array variable whose members correspond to the internal list of aliases as maintained by the alias builtin. Elements added to this array appear in the alias list

    
por 10.11.2016 / 23:58
1

Eu não conheço uma maneira de realmente listar a origem de seus aliases, mas como parece que você está usando o bash, acho que esses são os possíveis arquivos de origem:

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

Você deve ser capaz de encontrá-los, por exemplo, grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc .

    
por 10.11.2016 / 23:39
0

Eu tive sucesso simplesmente usando which .

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py
    
por 31.01.2018 / 19:52
0

Combinando resposta do thrig com @ sugestão do MarkPlotnick , você pode testar se BASH_ALIASES[ll] está definido para reduzi-lo. As variáveis BASH_SOURCE array e LINENO são particularmente úteis aqui. Infelizmente, a verificação se BASH_ALIASES[ll] está definido só terá sucesso após o alias ter sido definido e, portanto, a primeira dessas linhas poderá estar em outro arquivo.

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

Dar saída como:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

Você pode até mesmo terminar o shell usando esta verificação:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
    
por 22.11.2018 / 05:35
-1

Verifique ~ / .profile se não estiver em ~ / .bashrc

    
por 10.11.2016 / 23:22