Como testar possíveis conflitos ao usar alias no bashrc?

12

Existe uma maneira simples de listar todos os conflitos de comando que ocorreram no sistema devido à atualização bashrc envolvendo comandos alias?

Por exemplo, alguém escreve alias ls=/path/to/user-generated/executable no bashrc. Como se descobre que isso está mascarando um comando real ( ls ). Uma maneira parece ser executar todos os aliases antes e depois de fornecer bashrc e diferenciar a saída. Existem maneiras melhores?

Estou executando o Ubuntu 12.04.

bash --version

GNU bash, versão 4.2.24 (1) -release (i686-pc-linux-gnu)

    
por user13107 18.10.2012 / 07:26

5 respostas

7

Para descobrir quais comandos são mascarados pelos aliases, faça algo assim:

alias | sed 's/^[^ ]* *\|=.*$//g' | while read a; do
  printf "%20.20s : %s\n" $a "$(type -ta $a | tr '\n' ' ')"
done | awk -F: '$2 ~ /file/'

Explicação

alias alone lista os alias definidos e sed extrai o nome deles. O loop while executa type -ta em cada um deles e awk imprime as linhas que contêm alias e arquivo.

    
por 18.10.2012 / 17:44
13

Você pode usar type para descobrir como um comando seria interpretado por bash.

    
por 18.10.2012 / 07:48
7

Como sua primeira pergunta, não há como listar os conflitos, já que o bash usa internamente uma tabela de hash, registra apenas a última substituição.

Para descobrir se um comando é um alias, use alias ls no seu caso, se ele disser algo como "não encontrado", então não é um alias, caso contrário é.

Para iniciar a função original desconsiderando o alias, prefixe uma barra, por exemplo, \ls ativará o hash real ls, ignore o alias.

EDITAR

Se você quiser saber rapidamente se um comando é um alias, você pode habilitar o modo de depuração por set -x , agora se você executar ls :

Você verá uma saída de depuração do comando real sendo executado

Para remover o modo de depuração, use set -

    
por 18.10.2012 / 07:43
6

Você pode usar o bash builtin compgen para obter uma lista de todos os comandos e todos os aliases usando compgen -ac . Qualquer comando que também seja um alias será duplicado nessa lista, portanto, a solução simples e ingênua é procurar duplicatas na saída de compgen -ac .

No entanto, duplicatas também podem aparecer se um comando estiver no caminho duas vezes. Por exemplo, eu tenho /bin/which e /usr/bin/which então compgen -ac listará which duas vezes mesmo que não seja um alias.

Então, o que é necessário é obter todas as duplicatas de compgen -ac e compará-las a uma lista de aliases. Apenas duplicatas que também são aliases são aqueles aliases que ocultam comandos. Podemos fazer isso com o comando comm(1) e com a substituição do processo bash.

comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d) 

compgen -a | sort é a lista de todos os aliases (classificados por comm ). compgen -ac | sort | uniq -d é a lista de todos os duplicados da lista de comandos e aliases. comm -12 gera apenas as linhas comuns a ambos.

    
por 18.10.2012 / 12:16
5

Você pode usar o recurso de depuração do shell para ver exatamente o que está acontecendo quando o bash invoca um shell interativo. O seguinte deve mostrar todos os alias atribuídos quando um shell interativo é gerado a partir de um shell de login:

bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
  • -x - > ativar a depuração
  • -l - > shell de login
  • -i - > escudo interativo
  • -c - > comando

A execução da saída de comando é necessária para que o shell retorne. O -i é necessário neste caso porque o bash não configuraria um ambiente interativo para executar um comando de outra forma.

Aqui está um exemplo do meu sistema:

$ bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
++ alias 'ls=ls --color=auto'
$ alias -p
alias ls='ls --color=auto'

Para ver qual arquivo foi originado pela última vez quando o alias foi atribuído para determinar o arquivo que ocorreu, você pode estender o grep:

bash -x -l -i -c 'exit' 2>&1 | grep -E ' (alias|[.]|source) '

Isso pode retornar falsos positivos, mas deve ser bom se você estiver inspecionando manualmente os dados retornados. O número de símbolos '+' na frente do comando executado indica a profundidade.

+ . /home/jordan/.bashrc
++ alias 'ls=ls --color=auto'
++ . /home/jordan/.foo
+++ alias t=test
++ alias t=test2

Neste exemplo de saída, ele mostra que .bashrc define um alias para ls , .foo aliases t e, em seguida, .bashrc substitui o alias anterior de t .

    
por 18.10.2012 / 08:38