Existe uma maneira simples de listar todos os conflitos de comando que ocorreram no sistema devido à atualização do bashrc envolvendo comandos de alias?
Por exemplo, alguém escreve alias ls=/path/to/user-generated/executable
no bashrc. Como alguém descobre que isso está mascarando um comando real ( ls
). Uma maneira parece ser executar todos os aliases antes e depois do sourcing do bashrc e diferenciar a saída. Existem maneiras melhores?
Estou executando o Ubuntu 12.04.
bash --versão
Lançamento do GNU bash, versão 4.2.24 (1) (i686-pc-linux-gnu)
Respostas:
Para descobrir quais comandos são mascarados por aliases, faça algo assim:
Explicação
alias
sozinho lista aliases definidos esed
extrai seu nome. O loop while é executadotype -ta
em cada um deles eawk
imprime as linhas que contêm alias e arquivo.fonte
Você pode usar
type
para descobrir como um comando seria interpretado pelo bash.fonte
type ls
imprimels is aliased to `ls --color=auto'
aqui.which
, mas não o faço agora se ambos (tipo, qual) os componentes internos do shell são os mesmos.type which
diz-lhewhich is /usr/bin/which
, por isso não é um builtin. Portanto, ele não pode dizer se algo está embutido ou não (por exemplo,which echo
versustype echo
).type which
which is a shell builtin
estou usando o zsh.Como sua primeira pergunta, não há como listar os conflitos, já que o bash usa uma tabela de hash internamente, ela 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
, iniciará o hash real ls, ignore o alias.EDITAR
Se você quiser saber rapidamente se um comando é um alias, poderá ativar o modo de depuração
set -x
agora, se executarls
:Você verá uma saída de depuração do comando real sendo executada
Para desabilitar o modo de depuração, use
set -
fonte
alias
papel. E se um usuário não souber que existe um comando (por exemplols
)? A única coisa que ele parece saber depois de executaralias ls
é para o que é mapeado e não para o que foi originalmente mapeado. Eu acho que um terá que executar todos os comandos com e sem \ para encontrar conflitos.Você pode usar o bash embutido
compgen
para obter uma lista de todos os comandos e todos os aliases usandocompgen -ac
. Qualquer comando que também seja um alias será duplicado nesta lista, portanto a solução simples e ingênua é procurar duplicatas na saída decompgen -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ãocompgen -ac
, listareiwhich
duas vezes, mesmo que não seja um alias.Portanto, o que é necessário é obter todas as duplicatas
compgen -ac
e comparar com uma lista de aliases. Apenas duplicatas que também são aliases são aqueles que ocultam comandos. Podemos fazer isso com ocomm(1)
comando e com a substituição do processo bash.compgen -a | sort
é a lista de todos os aliases (classificados paracomm
).compgen -ac | sort | uniq -d
é a lista de todas as duplicatas da lista de comandos e aliases.comm -12
produz apenas as linhas comuns a ambos.fonte
Você pode usar o recurso de depuração do shell para ver exatamente o que está acontecendo quando o bash chama um shell interativo. A seguir, mostramos todos os aliases atribuídos quando um shell interativo é gerado a partir de um shell de logon:
-x
-> ativar a depuração-l
-> shell de login-i
-> shell interativo-c
-> comandoA execução da saída do comando é necessária para que o shell retorne. o
-i
é necessária neste caso porque o bash não iria criar um ambiente interativo para executar um comando contrário.Aqui está um exemplo do meu sistema:
Para ver qual arquivo foi originado pela última vez quando o alias foi atribuído para determinar o arquivo em que ocorreu, você pode estender o grep:
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.
Nesta saída de amostra, mostra que .bashrc define um alias para
ls
, .foo aliasest
e, em seguida, .bashrc substitui o alias anterior det
.fonte