Como posso encontrar uma declaração de apelido não autorizado?

37

Estou tentando encontrar onde um específico aliasfoi declarado. Pesquisei todos os lugares habituais que conheço para procurar aliases:

  • ~ / .bashrc
  • ~ / .bash_profile
  • / etc / bashrc
  • / etc / profile

Sem sorte.

Eu sei que é aliasporque, quando faço which COMMAND, recebo:

alias COMMAND='/path/to/command'
    /path/to/command

Existe uma maneira de encontrar qual arquivo declara aliasapenas saber o aliasnome?

sombrio
fonte
3
Uma pergunta relacionada sobre variáveis ​​de ambiente em vez de aliases. Basicamente, não há uma maneira fácil, pois o alias poderia ter sido definido em qualquer lugar. Tente colocar set -xcomo sugerido na parte superior do seu e veja se isso o reduz para você.
Jw013
11
Você teria que colocar set -xno topo de /etc/bash_profileou /etc/bashrc. Por que não apenas correr bash -i -xou bash -l -x?
Mikel

Respostas:

30

Eu procuraria /etc/profile.d/a ofensa alias.

Você também pode fazer o seguinte para encontrá-lo:

grep -r '^alias COMMAND' /etc

Isso irá recursivamente grepatravés de arquivos procurando por uma linha começando com alias COMMAND.

Se tudo mais falhar, coloque isso no final da sua ~/.bashrc

unalias COMMAND
sombrio
fonte
26

Há algumas coisas que você pode tentar:

  1. use bash -vpara ver quais linhas estão sendo lidas durante a inicialização do shell
  2. use bash -xpara ver quais comandos estão sendo executados durante a inicialização do shell
  3. executar com apenas um arquivo de inicialização

bash -v

A -v opção permite bashimprimir cada linha de cada arquivo de script que ele lê enquanto lê.

Comece executando

bash -i -v >bash-i.out 2>&1

aguarde 5 a 10 segundos e pressione Ctrl+C.

Isso fornecerá um único arquivo chamado, bash-i.outsemelhante a todos os seus arquivos de inicialização mesclados (ou concatenados).

Em seguida, use lesspara abrir o arquivo e procure o alias usando /aliasname.

Agora, compare onde esse alias aparece em relação a outras linhas no arquivo. Por exemplo, na maioria dos sistemas, /etc/bash.bashrctem um comentário no topo que diz /etc/bash.bashrce ~/.bashrctambém um.

Se estiver acima da parte superior do seu ~/.bashrc, provavelmente é um arquivo de inicialização /etcque define o alias; caso contrário, ele está no seu ~/.bashrcou em um arquivo que está incluindo via sourceou .(comando dot).

Se isso não mostrar o alias, tente

bash -l -v >bash-l.out 2>&1

Isso diz bash para ser um shell de login, que lê alguns arquivos de inicialização diferentes, por exemplo /etc/profilee ~/.bash_profile, em vez de /etc/bash.bashrce ~/.bashrc.

bash -x

Se bash -vnão lhe der uma resposta definitiva, tente executar bash -x, que imprime os comandos que o shell está executando, em vez das linhas que seu shell está lendo.

O método é basicamente o mesmo que o acima, exceto a alteração -vpara -x. (Você pode usar os dois juntos, se necessário.)

Executar com apenas um arquivo de inicialização

bash -i --rcfile="$HOME/.bashrc"

e veja se você tem o alias.

Tente o mesmo com rcfiledefinido como /etc/bash.bashrcse o seu sistema tiver.

Então tente

bash -l --rcfile="$HOME/.bash_profile"

e faça o mesmo com todos os arquivos de inicialização do bash que tenham profileseu nome, por exemplo, mude $HOME/.bash_profilepara /etc/profile.

Qualquer que seja a maneira que o alias apareça, informa o arquivo que você deve começar a procurar.

Mikel
fonte
2

Talvez o seu .xinitrc? Você também deve verificar se você .bashrcou .bash_profileoutros arquivos neles. Por exemplo, mantenho todos os meus aliases em um arquivo separado referenciado por este comando:

[ -f ~/.bash_alias ] && source $HOME/.bash_alias

Algumas perguntas que também podem ajudar: Isso é para um usuário comum ou root? Que comando é esse? Qual o sabor do Linux?

SigueSigueBen
fonte
0

Sigo a prática muito comum de colocar minhas definições de alias em

~/.bash_aliases

e então chamando isso de .bashrc com

[ -f ~/.bash_aliases ] && source $HOME/.bash_aliases
Michael Durrant
fonte
posso adivinhar que você quer dizer .bash_aliases em seu segundo comando em vez de .bash_alias?
stagl