Como determinar de onde veio uma variável de ambiente?

154

Eu tenho uma instância do Linux que configurei há algum tempo. Quando eu inicio e faço o login, rootexistem algumas variáveis ​​de ambiente que eu configuro, mas não consigo me lembrar ou descobrir de onde elas vieram.

  • Eu verifiquei ~/.bash_profile, /etc/.bash_rce todos os scripts de inicialização.
  • Eu corri finde grepsem sucesso.

Sinto que devo estar esquecendo de parecer óbvio em algum lugar. Existe um truque para descobrir isso?

Joel
fonte
6
/etc/environmenté outro.
Derobert
8
E /etc/env.d/*arquivos. Mas fazer grep -R "YOUR_VARIABLE" /etc/é provavelmente a melhor maneira de descobrir.
rozcietrzewiacz
1
No Mac OS X, consulte também Como encontro onde uma variável ambiental foi definida?
Gilles
@rozcietrzewiacz da maneira mais simples ... se a variável estiver realmente localizada em algum lugar em / etc / (como no meu caso); se você postá-lo como resposta, eu gostaria de votar;)
Line

Respostas:

55

Se você usar o envcomando para exibir as variáveis, elas deverão aparecer aproximadamente na ordem em que foram criadas. Você pode usar isso como um guia para se eles foram definidos pelo sistema muito cedo na inicialização ou por um arquivo .profile ou outro arquivo de configuração posterior. Na minha experiência, os comandos sete exportclassificarão suas variáveis ​​por ordem alfabética, para que a listagem não seja tão útil.

Ben Combee
fonte
1
Isso é ótimo ... exceto que estou tentando descobrir o que está limpando uma variável de ambiente (definida em / etc / environment). :-) (E sim, ele está sendo definida inicialmente ... Eu estou adicionando linhas em scripts em vários para registrar onde fica limpo ...)
Michael Scheper
128

Se zshé o seu shell de login:

zsh -xl

Com bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

Isso simulará um shell de login e mostrará tudo o que é feito (exceto nas áreas em que o stderr é redirecionado zsh) junto com o nome do arquivo atualmente sendo interpretado.

Portanto, tudo o que você precisa fazer é procurar o nome da sua variável de ambiente nessa saída. (você pode usar o scriptcomando para ajudá-lo a armazenar toda a saída da sessão do shell ou, para a bashabordagem, use em 7> file.logvez de 7>&2armazenar a xtracesaída em file.logvez de no terminal).

Se sua variável não estiver lá, provavelmente o shell a herdou na inicialização, por isso foi definida antes, como na configuração do PAM, nas ~/.ssh/environmentcoisas ou lidas na inicialização da sessão do X11 ( ~/.xinitrc, ~/.xsession) ou na definição de serviço que iniciou seu login gerente ou até mais cedo em algum script de inicialização. Então um find /etc -type f -exec grep -F THE_VAR {} +pode ajudar.

Stéphane Chazelas
fonte
4
Impressionante e útil, obrigado. Para nós, n00bs, você poderia explicar um pouco mais sobre o modo e como sair do modo que isso nos coloca? Por exemplo, não podemos simplesmente canalizar grep essa saída.
Geoffrey Hale
5
@GeoffreyHale Se você zsh -xl 2>&1, por exemplo, mesclar as saídas stderr e stdout, poderá cumprimentar como de costume.
Rakesh
1
Existe alguma maneira de fazer isso com o fishshell?
Nick Sweeting
Mesmo se eu usar zsh -xl 2>&1, de alguma forma eu não posso grep normalmente. Aparentemente, a saída não contém novas linhas apropriadas ou algo assim.
Xerus 23/07
Eu acho que você poderia apenas usar PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), então grep nesse arquivo aleatório também.
bd1251252 8/09
51

Alguns lugares para procurar primeiro:

No âmbito do sistema

  • /etc/environment: especificamente destinado a variáveis ​​de ambiente
  • /etc/env.d/*: variáveis ​​de ambiente, divididas em vários arquivos
  • /etc/profile: todos os tipos de scripts de inicialização
  • /etc/profile.d/*: scripts de inicialização
  • /etc/bashrc, /etc/bash.bashrc: destinado a funções e aliases

Específico do usuário

  • ~/.bash_profile: inicialização para shells de login (bash-)
  • ~/.bashrc: inicialização para todos os shells interativos (bash-)
  • ~/.profile: usado para todas as conchas
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Semelhante para os reservatórios não festança
beetstra
fonte
31

@Cian está correto. Além de usar finde grep, não há muito que você possa fazer para descobrir de onde veio. Sabendo que é de fato uma variável de ambiente, eu tentaria focar sua pesquisa no / etc / e no diretório inicial. Substitua VARIABLEpela variável apropriada que você está procurando:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

Aaron Toponce
fonte
1
É surpreendente que uma resposta que diga 'você não pode', cercada por respostas dizendo 'sim, você possa', tenha muitos votos positivos.
Michael Scheper
Não vejo respostas que realmente permitam determinar ONDE uma variável foi definida. Existem algumas dicas úteis, mas nenhuma linha que pode fazer o trabalho.
Andrew Wagner
Essa coisa resolveu meu tempo. Thanx.
Hassan Raza
@ MichaelScheper "você não pode" fazê-lo sem localizar / grep. posteriormente em "você pode", é descrito como fazê-lo USANDO grep
Line
23

Se você colocar set -xseu .profileou .bash_profile, todos os comandos shell subsequentes serão registrados com erro padrão e você poderá ver se um deles define essas variáveis. Você pode colocar set -xno topo /etc/profilepara rastreá-lo também. A saída pode ser muito detalhada, portanto, você pode redirecioná-la para um arquivo com algo parecido exec 2>/tmp/profile.log.

Se o seu sistema usa o PAM, procure pam_envsolicitações de carregamento em /etc/pam.confou /etc/pam.d/*. Este módulo carrega variáveis ​​de ambiente dos arquivos especificados ou de um padrão do sistema se nenhum arquivo for especificado ( /etc/environmente /etc/security/pam_env.confno Debian e Ubuntu). Outro arquivo com definições de variáveis ​​de ambiente no Linux é /etc/login.defs(procure linhas começando com ENV_).

Gilles
fonte
5

Verifique nos scripts de inicialização os arquivos que eles utilizam usando .(ponto) ou source. Esses arquivos podem estar em outros diretórios além de /etce $HOME.

Dennis Williamson
fonte
2

Para os zshusuários, o rastreamento dos arquivos acessados ​​(durante a inicialização) pode ser útil, eles não são muitos e é possível procurá-los um por um para descobrir onde algo foi definido.

zsh -o SOURCE_TRACE
Erik Zivkovic
fonte
0

variáveis ​​de ambiente são armazenadas no arquivo / etc / profile, faça mais / etc / profile e verifique as variáveis ​​de ambiente desejadas e se o / etc / profile não estiver presente, lokk para o arquivo .profile em seu diretório pessoal

Sarvesh Pawar
fonte
1
As variáveis ​​de ambiente não são armazenadas /etc/profile, você pode defini-las no sistema inteiro, por exemplo, bashquando usadas como um shell de login. Eles são armazenados pelo processo do shell após a leitura nas definições dos arquivos e / ou linha de comando.
Anthon
-2

Por exemplo, se você deseja encontrar a variável HISTFILE e seu valor ou deseja saber quais variáveis ​​são definidas sobre o histórico, digite isso no shell:

set | grep HIST
env | grep HIST
printenv | grep HIST
Vusal Aliyev
fonte
se você já sabe o nome, por que não echo "$HISTFILE":?
Jeff Schaller
porque, queremos encontrar onde a variável $ HISTFILE está definida. Além disso, se eu wnat saber quais variáveis é definida abou história
Vusal Aliyev
2
Infelizmente, setnão informa qual arquivo definiu a variável.
Jeff Schaller