if ($answer_counter == 1): ?>
endif; ?>
- Para responder sua segunda pergunta primeiro,
- Trivially, os programas
env
e printenv
use environ
para listar todo o ambiente.
- A maioria das camadas usa
environ
para copiar cada variável de ambiente em uma variável de shell exportada.
(Por exemplo, no bash,
comandos como set
, export
e declare
(sem argumentos)
listará todo o ambiente, juntamente com as variáveis não exportadas.
- Eu não sei exatamente como eles lidam com isso,
mas
su
e sudo
passam uma cópia higienizada do ambiente
aos programas que eles invocam.
Eles podem fazer isso iterando pelo ambiente
e decidir quais variáveis passar, quais omitir,
e quais modificar.
- Por que
environ
está exposto e documentado ao programador de aplicativos?
- Porque alguns programas precisam disso (veja acima).
- O kernel precisa passar o ambiente para o processo (quando ele é iniciado)
de alguma forma.
getenv
e setenv
(e algumas outras coisas)
precisa ter acesso ao ambiente.
É complicado para o kernel
para se comunicar com uma rotina de biblioteca que não está ativa
(ou seja, para passar informações para qualquer parte do programa
outro que a rotina que está invocando o kernel).
Torna-se duplamente difícil, dado que,
se você estiver usando bibliotecas estáticas,
getenv
e setenv
nem serão vinculados à sua imagem do processo
se o programa não ligar para eles.
Usar uma variável global é a solução mais fácil.
- Por que os designers / desenvolvedores fizeram isso dessa maneira?
Por que não?
O processo possui seu ambiente;
é permitido fazer o que quiser com isso.