De onde o comando printenv lê variáveis de ambiente que eu não defini?

2

O comando printenv lista um número de variáveis de ambiente, a maioria das quais eu não defini. De onde lê esses valores? Onde estão as variáveis de ambiente armazenadas no Linux? strace printenv deu uma indicação para mim de que ele abre / usr / lib / locale / locale-archive, mas não obtive uma ideia clara.

    
por Jay 01.01.2014 / 15:35

2 respostas

2

Eles não estão definidos em um único lugar. Quando seu shell é iniciado, ele geralmente lê vários scripts de inicialização que definem algumas variáveis de ambiente, como por exemplo /etc/profile e, por exemplo, no caso do Bash, também /etc/bashrc e ~/.bashrc . Mas isso depende principalmente da sua distribuição e do seu shell.

Além disso, muitos aplicativos que você provavelmente está executando, como, por exemplo, o X11 ou o emulador de terminal, definirão mais variáveis em seu ambiente.

Então, como você vê, essas variáveis vêm de muitos lugares diferentes. Com strace , você pode ver de onde eles são lidos, se estiverem sendo definidos no tempo de execução de printenv , mas esse não é o caso, porque eles são definidos anteriormente e mantidos na memória.

Eu não conheço nenhuma boa maneira de rastrear de onde vem a variável que foi configurada. Mas, por exemplo, se você usar o Bash, poderá iniciá-lo com o parâmetro --verbose para, pelo menos, ver quais arquivos estão sendo lidos na inicialização. Como bash --verbose .

    
por 01.01.2014 / 15:43
0

Os processos herdam as variáveis de ambiente de seus pais, eles não os lêem de um arquivo. A maioria dos programas tem as mesmas variáveis de ambiente que o programa que os iniciou e nunca os modifica.

Quando você efetua login, várias variáveis de ambiente são configuradas pelo sistema de login. Os detalhes dependem da distribuição e da configuração específica do sistema. Você pode encontrar HOME e PATH em todos os lugares, e USER , LOGNAME , MAIL e SHELL são muito comuns.

Na maioria dos sistemas, as variáveis de ambiente também podem ser listadas em /etc/environment e ~/.pam_environment ; esses arquivos são lidos quando você efetua login por qualquer método. Quando você efetua login em um shell interativo (no modo de texto ou por SSH), ou frequentemente, mas nem sempre, quando você faz login no modo gráfico (isso depende do gerenciador de exibição, o gerenciador de sessões e a distribuição), o shell lê /etc/profile e ~/.profile (ou possivelmente outros arquivos, dependendo do shell e da configuração). Esses arquivos, assim como outros arquivos e programas envolvidos no processo de login, geralmente definem variáveis de ambiente.

Não há receita milagrosa para descobrir qual programa ou configuração faz com que uma variável de ambiente seja definida. Você pode procurar definições em seus arquivos de configuração e nos arquivos de configuração do sistema:

grep -rs SOMEVAR /etc ~/.[!.]*

Isso não encontrará nomes de variáveis de ambiente que sejam codificados em aplicativos. Você também pode examinar diferentes processos para ver quais os que o possuem, o que dá uma indicação de qual deles o definiu. No Linux, o comando a seguir mostra as variáveis de ambiente do processo 1234:

tr \0 \n </proc/1234/environ | sort

Note que os shells possuem suas próprias variáveis, que não são variáveis de ambiente. Uma atribuição em um script de shell ou na linha de comando ( VAR=VALUE ) define uma variável de shell; se a variável for exportada ( export VAR=VALUE ou export VAR após VAR ter um valor), ela se tornará uma variável de ambiente visível por processos filhos. Todas as variáveis de ambiente se tornam automaticamente variáveis de shell.

    
por 02.01.2014 / 01:34