Como encontrar todos os locais em que $ PATH está definido [duplicado]

0

Gostaria de saber se existe uma maneira de determinar onde uma parte específica da minha variável $ PATH está sendo definida.

Cerca de um ano e meio atrás, passei pelo tedioso processo de configurar um Oracle XE 11.2.0 na minha máquina para um curso que estava fazendo. Em algum lugar no processo, adicionei o caminho "/u01/app/oracle/product/11.2.0/xe/bin" à minha variável $ PATH para fazer as coisas funcionarem. Bem, agora eu deletei a pasta root / u01 / que era usada exclusivamente pelo banco de dados Oracle e, assim, o bash lança o erro na inicialização de que o arquivo ou diretório não existe. Então eu fui procurar manualmente todos os arquivos possíveis que encontrei listados e nada.

Até onde eu sei, essa parte do $ PATH não está sendo definida em nenhum desses arquivos: /etc/login.defs , ~/.profile , /etc/environment , /etc/profile , ~/.bash_login , ~/.bash_profile ou ~/.bashrc .

Isso foi verificado primeiro executando cat ~/.bashrc | grep "*oracle*" em todos os arquivos listados acima. Eu até fiz a coisa insana e corri sudo strings /dev/sdb -n 11 | grep -C100 "/u01/app/oracle/*" para me dar uma lista de todos os arquivos que continham a string. Eu tenho muitos resultados, mas nada super valioso. Meu pobre SSD não merecia isso.

Então, alguma dica? Como posso descobrir onde essa parte do $ PATH está sendo concatenada? Existem outros arquivos típicos que eu deveria verificar? Eu estou rodando isso no Linux Mint 18.3, se isso reduzir tudo.

    
por Aaron Chamberlain 23.07.2018 / 10:45

3 respostas

1

Uma maneira de depurar a inicialização do shell seria executar um login, um shell interativo ( -li ) e dizer a ele para imprimir todos os comandos conforme eles são executados e procurar o que você deseja na saída:

PS4=' $BASH_SOURCE:$LINENO: ' bash -lixc true |& grep oracle

PS4 é usado pelo bash para imprimir as informações extras da opção -x e, quando definido como $BASH_SOURCE:$LINENO , imprimirá o caminho para o arquivo que está sendo originado e o número da linha que está sendo executado. A execução com -c true |& grep oracle nos permite filtrar rapidamente a inicialização de um único shell. Com o espaço principal, o bash pretende criar linhas quando o aprovisionamento aninhado ocorre.

    
por 23.07.2018 / 11:59
0

Tente

grep -lr /u01/app/oracle/product/11.2.0/xe/bin /etc/*

Isso lista os arquivos em /etc/ contendo o elemento path. Se você disse que não está nos arquivos listados na pergunta, deve estar abaixo de /etc/ . Meu palpite seria algum arquivo em /etc/profile.d/ .

Atualização 1

Supondo que você use bash, você pode tentar bash -v ou bash -x para tentar ver quais comandos são executados. bash -v despeja a fonte original, bash -x despeja os comandos realmente executados com variáveis expandidas. As bandeiras podem ser combinadas, ao custo de se tornar muito menos legível:)

    
por 23.07.2018 / 11:06
0

Você também pode verificar a string oraenv .

O instalador do banco de dados Oracle geralmente cria um par de scripts: /usr/local/bin/oraenv para definir todas as variáveis de ambiente exigidas pelo mecanismo de banco de dados Oracle e /usr/local/bin/coraenv para desativá-las. Como esses scripts visam manipular as variáveis de ambiente da sessão atual, eles precisam ser "originados" ou não terão o efeito esperado.

Você pode ter incluído oraenv em seus login scripts como este:

ORACLE_SID=<database SID here>
ORAENV_ASK=NO
. oraenv

A última linha também pode ser source oraenv .

    
por 23.07.2018 / 12:34