Como determinar de onde uma variável de ambiente veio

116

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

  • Eu verifiquei ~/.bash_profile , /etc/.bash_rc e toda a inicialização scripts.
  • Eu corri find e grep sem sucesso.

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

    
por Joel 19.08.2010 / 20:07

9 respostas

49

Se você usar o comando env para exibir as variáveis, elas deverão aparecer mais ou menos na ordem em que foram criadas. Você pode usar isso como um guia para se eles foram definidos pelo sistema bem no início da inicialização, ou por um arquivo de configuração .profile ou outro arquivo de configuração posterior. Na minha experiência, os comandos set e export classificarão suas variáveis por ordem alfabética, para que a listagem não seja tão útil.

    
por 20.08.2010 / 02:39
96

Se zsh for 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 em áreas onde o stderr é redirecionado com zsh ) junto com o nome do arquivo sendo interpretado atualmente.

Portanto, tudo o que você precisa fazer é procurar o nome de sua variável de ambiente nessa saída. (você pode usar o comando script para ajudar a armazenar toda a saída da sessão do shell ou, para a abordagem bash , usar 7> file.log em vez de 7>&2 para armazenar xtrace output em file.log em vez de on o terminal).

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

    
por 11.09.2014 / 09:26
31

Alguns lugares para procurar primeiro:

Em todo o 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 : significado para funções e aliases

Específico ao usuário

  • ~/.bash_profile : inicialização para shells de login (bash-)
  • ~/.bashrc : inicialização para todos os shells interativos (bash)
  • ~/.profile : usado para todos os shells
  • ~/.cshrc , ~/.zshrc , ~/.tcshrc : semelhante para shells não bash
por 17.12.2015 / 10:58
25

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

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

    
por 19.08.2010 / 22:23
20

Se você colocar set -x no seu .profile ou .bash_profile , todos os comandos subsequentes do shell serão registrados no erro padrão e você poderá ver se um deles define essas variáveis. Você pode colocar set -x no topo de /etc/profile para rastreá-lo também. A saída pode ser muito detalhada, então você pode querer redirecioná-la para um arquivo com algo como exec 2>/tmp/profile.log .

Se o seu sistema usa o PAM, procure por pam_env load requests em /etc/pam.conf ou /etc/pam.d/* . Este módulo carrega variáveis de ambiente dos arquivos especificados, ou a partir de um padrão do sistema, se nenhum arquivo for especificado ( /etc/environment e /etc/security/pam_env.conf no Debian e no Ubuntu). Outro arquivo com definições de variáveis de ambiente no Linux é /etc/login.defs (procure as linhas que começam com ENV_ ).

    
por 20.08.2010 / 15:49
4

Verifique se há arquivos em seus scripts de inicialização que eles usam . (ponto) ou source . Esses arquivos podem estar em outros diretórios, além de /etc e $HOME .

    
por 20.08.2010 / 01:29
1

Para zsh usuários, rastrear os arquivos que são acessados (durante a inicialização) pode ser útil, eles não são muitos e pode-se procurar por eles um a um para descobrir onde algo foi definido.

zsh -o SOURCE_TRACE
    
por 23.02.2018 / 13:39
0

variáveis de ambiente são armazenadas no arquivo / etc / profile mais / etc / profile e apenas verifique se há variáveis env que deseja e se / etc / profile não estiver presente, então lokk para o arquivo .profile em seu diretório home

    
por 07.01.2015 / 12:14
-1

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

set | grep HIST
env | grep HIST
printenv | grep HIST
    
por 28.03.2017 / 16:52