Como encontrar um lugar onde uma constante é definida no Bash

3

Eu preciso encontrar pelo menos um arquivo em que $JAVA_HOME seja definido (exportado). Existe alguma maneira inteligente de fazer isso além da pesquisa de texto em arquivos?

    
por Rytis Alekna 02.03.2015 / 08:23

1 resposta

7

Para descobrir qual arquivo define JAVA_HOME , execute:

PS4='+ $BASH_SOURCE:$LINENO:' BASH_XTRACEFD=7 bash -xlic ""  7>trace.out

Isso gera a saída de depuração para um shell de login bash e salva-o no arquivo trace.out . Haverá muitas linhas nesse arquivo. As linhas parecem:

+ /etc/profile:7:PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
+ /etc/profile:9:export PATH

Isto mostra (a) o nome do arquivo atualmente sendo executado, (b) o número da linha e (c) a saída de depuração para aquela linha naquele arquivo. Basta pesquisar por JAVA_HOME . Por exemplo:

grep JAVA_HOME trace.out

Como funciona

  • PS4='+ $BASH_SOURCE:$LINENO:'

    Ao criar um rastreamento de execução, bash será prefixado em todas as linhas com uma expansão de PS4 . Aqui, fazemos PS4 exibir o arquivo de origem e o número da linha que está sendo lida.

  • BASH_XTRACEFD=7

    Isso envia o rastreio de execução para 7 , que é um descritor de arquivo escolhido na esperança de que os arquivos iniciados bash não sejam mexidos.

  • bash -xlic ""

    Isso inicia o bash com as opções -x , o que faz com que todos os comandos sejam exibidos com o prompt PS4 , -l , que instrui bash a tratar isso como um shell de login, -i que faz o shell interativo e -c "" , que faz com que a nova saída do shell seja concluída assim que a inicialização for concluída.

  • 7>trace.out

    Isso redireciona a saída do rastreamento para o arquivo.

por John1024 02.03.2015 / 08:44

Tags