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 diferenciarXTRACE
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çõesPS4
ouPROMPT4
. -
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.
- com o modo interativo ativado (
-
|&
é um atalho para2>&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 seralias subl="..."
devido à análise. (Em zsh você pode até mesmo definir um alias sem usar o comandoalias
através da atribuição de valor-chave em pares na matriz assoziativealiases
:aliases[subl]="..."
)