Encontre a localização de uma definição de alias

0

Eu posso encontrar a localização de uma definição de função , mas isso não funciona para aliases:

$ type -a subl

subl is an alias for /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl
subl is /Users/brandon/bin/subl

Eu quero saber onde esse alias é definido , não o que é definido como , ou onde aponta em>. Em outras palavras: se eu quiser alterá-lo, qual é o número do arquivo e da linha para onde ir. Eu pesquisei meu .zshrc e os diretórios nos quais eu mantenho os arquivos que ele origina, e estou encontrando nada 1 . Como posso encontrá-lo sem ter que procurar manualmente?

1. Eu finalmente encontrei-o executando zsh -v e pesquisando por subl e, em seguida, lendo para cima até encontrar uma linha que começou com source . No entanto, eu gostaria de uma maneira não manual de fazer isso no futuro.

    
por iconoclast 06.06.2016 / 22:09

1 resposta

3

Solução

Isso deve funcionar:

PS4='+%x:%I>' zsh -i -x -c '' |& grep subl

Isso deve imprimir algo como

+/Users/brandon/.zshrc.d/aliases.zsh:32>alias 'subl=/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'

Isso significa que no arquivo /Users/brandon/.zshrc.d/aliases.zsh (apenas por exemplo) na linha 32 o comando alias 'subl=/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl' foi executado. Note que a linha de comando mostrada é o resultado da análise do comando escrito no arquivo, como tal, eles podem não ser indentais.

Explicação

A configuração de zsh é essencialmente uma lista de comandos do shell. As informações de onde um comando foi executado normalmente só estão disponíveis no momento em que o comando é executado. Uma vez que o comando termine, quaisquer alterações no ambiente ou configurações do shell podem permanecer, mas a informação de como essas mudanças ocorreram se foi. Portanto, pesquisar os arquivos de configuração ou rastrear as informações durante o tempo de execução são as únicas opções.

A pesquisa nos arquivos de configuração é - como você percebeu - propensa a erros, já que é fácil ignorar alguns arquivos de configuração; zsh carrega diretamente até oito arquivos de configuração diferentes ao iniciar um shell interativo e qualquer número de arquivos adicionais pode ser originado de lá.

É aqui que entra zsh XTRACE ( -x ). Semelhante a VERBOSE ( -v ) XTRACE imprime as linhas de comando que são executadas, mas também precede cada linha com o prompt PS4 . PS4 pode ser configurado para mostrar o arquivo e o número da linha atualmente executados. (Por padrão, PS4 mostra o nome da função ou arquivo de script e o número da linha atualmente executada. Portanto, se uma linha de código estiver dentro de uma função, ela não mostrará imediatamente onde está definida.).

Em detalhes, o comando acima faz o seguinte:

  • Defina a variável de ambiente PS4 para +%x:%I> (somente para este comando). %x é substituído pelo nome do arquivo que contém o código-fonte atualmente em execução. %I é o número da linha desse código dentro do arquivo. + e > são decoração para diferenciar XTRACE de saída de qualquer saída que o script possa gerar.

    Observação: Isso pode não funcionar corretamente se PS4 estiver definido com um valor diferente em algum lugar da configuração. Caso a saída não tenha o formato desejado, pode ser necessário primeiro remover / comentar as configurações PS4 ou PROMPT4 .

  • zsh começa zsh

    • com o modo interativo ativado ( -i )
    • com XTRACE ativado ( -x )
    • e apenas executa uma linha de comando vazia ( -c '' ), saindo imediatamente depois disso.

    Isso significa que apenas os arquivos de inicialização para o modo interativo são executados e não há confusão de geração de prompt ou comandos de gancho.

  • |& é um atalho para 2>&1 | , que liga o saída padrão e erro padrão de um comando para o entrada padrão do a seguir.
  • grep subl procura por "subl". Sugiro procurar apenas o nome do alias, pois a linha de comando exata pode não ser alias subl="..." devido à análise. (Em zsh você pode até mesmo definir um alias sem usar o comando alias através da atribuição de valor-chave em pares na matriz assoziative aliases : aliases[subl]="..." )
por 06.07.2016 / 15:35

Tags