É possível verificar onde um alias foi definido?

24

Um alias, como llé definido com o aliascomando

Posso verificar o comando com coisas como as type llque imprimem

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

ou command -v llque imprime

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

ou alias llque 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 passar por todos os arquivos carregados bashe verificar cada um deles?

polemon
fonte
Fora do manguito, eu diria correrbash -xl
Jeff Schaller

Respostas:

21

A definição manual será difícil de identificar (os registros do histórico, talvez), embora solicite ao shell que mostre o que está fazendo e, em seguida grep, ajude a encontrar os definidos 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 interativamente o comando nulo), então script:

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

Outra opção seria usar algo como straceou sysdigencontrar todos os arquivos tocados pelo shell e depois acessá- greplos manualmente (útil se o shell ou o programa não tiver um -xsinalizador); os arquivos RC padrão não são suficientes para uma verificação manual do nome de arquivo, se algo como oh-my-zsh ou configurações específicas do site estão obtendo um código de quem sabe onde (ou também pode haver variáveis ​​de ambiente, como sorontar aponta em sua resposta) .

agitar
fonte
Obrigado! Embora a saída seja um pouco difícil de analisar, mas encontrei o arquivo que definia o alias que eu estava procurando. Quando o alias não estiver presente em nenhum lugar da lista, seria seguro assumir que o alias foi definido manualmente?
Polemon
@polemon um pouco seguro; poderia ser (ou ter sido) definido em um arquivo que não está sendo lido por causa de quem sabe o motivo ou foi excluído (especialmente se houver algum tipo de estrutura de shell que adicione complexidade que o usuário não Compreendo).
thrig
1
Para fazer o ponto onde o alias é definido um pouco mais fácil de encontrar, você pode usar PS4, que é anexado a cada linha em um rastreamento:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick
5

Aqui é onde eu acho grep -rlmuito útil:

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

informará em qual arquivo a palavra aliasé usada.

Provavelmente dentro ~/.bashrce certamente dentro ~/.bash_aliasesse existe.


No entanto, é impossível ter certeza absoluta 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_ENVpode direcionar o bash para carregar outros arquivos.

procura a variável BASH_ENV no ambiente, expande seu valor se aparecer lá e usa o valor expandido como o nome de um arquivo para ler e executar.

E aliases podem até ser definidos configurando uma variável (ênfase minha):

BASH_ALIASES
Uma variável de matriz associativa cujos membros correspondem à lista interna de aliases, mantida pelo alias incorporado. Os elementos adicionados a esta matriz aparecem na lista de alias

sorontar
fonte
grep -rl alias ~/.bash*pode corresponder falsamente aos arquivos de histórico, mas +1 por apontar a matriz BASH_ALIASES!
Jeff Schaller
2

Não conheço uma maneira de realmente listar a fonte 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 dar uma olhada neles para encontrar o alias, por exemplo grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.

edaemon
fonte
Ou arquivos incluídos a partir daí ...
Jeff Schaller
@ JeffSchaller - Certo, você precisaria de algo mais complexo para isso bash -x, como você mencionou. Achei que o acima foi fácil de executar rapidamente e, se não encontrar o alias, você poderá ler as etapas de execução.
Edaemon #
1

Combinando a resposta do thrig com a sugestão do @ MarkPlotnick , você pode testar se BASH_ALIASES[ll]está definido para reduzi-lo. A BASH_SOURCEmatriz e as LINENOvariáveis ​​são particularmente úteis aqui. Infelizmente, a verificação se BASH_ALIASES[ll]está definida só será bem-sucedida após a definição do alias e, portanto, a primeira linha desse tipo 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

Dando 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é 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'
muru
fonte
0

Eu tive sucesso usando simplesmente which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py
Charles Clayton
fonte
1
whichpode manipular aliases no tcsh (e talvez no csh anterior) e no zsh onde ele é embutido, e no bash usando o perfil padrão na família RedHat, que possui um kludge para executar o programa GNU (externo), mas alimentá-lo com dados alternativos de shell, caso contrário não . Mais importante, ele apenas informa como o alias está definido, não onde foi definido, qual era o Q aqui.
David_thompson_085
-1

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

Michael Tatum
fonte
Ou arquivos incluídos a partir daí ...
Jeff Schaller
-1

Finalmente encontrei a lldefinição de alias para nosso servidor Web (CentOS) em dois scripts de shell em /etc/profile.d/:

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

Eu encontrei-o pelo primeiro aprendizado a partir dos comentários acima, onde o perfil de todo o sistema foi: /etc/profile. Esse arquivo indica que os aliases de todo o sistema são definidos /etc/bashrce, nesse arquivo, vi que ele percorre vários scripts de shell /etc/profile.d/, e então usei grepnesse diretório e finalmente encontrei as definições. Eu também descobri que existe um l.alias que lista todos os arquivos de ponto:

De colorls.sh:

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(Existem aliases equivalentes em colorls.csh.)

Jordan Bradford
fonte
-1

Primeiro use os seguintes comandos

Listar todas as funções

functions 

Listar todos os aliases

alias 

Se você não encontrar o alias ou a função, considere um método de pesquisa mais agressivo

Versão Bash

bash -ixlc : 2>&1 | grep thingToSearchHere

Versão Zsh

zsh -ixc : 2>&1 | grep thingToSearchHere

Breve explicação das opções

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

-l      Make bash act as if invoked as a login shell
jasonleonhard
fonte