As variáveis de ambiente não são apenas para preferências do usuário. Eles são um mecanismo genérico para comunicar uma variedade de informações de configuração de um processo pai para processos filhos que ele inicia.
Existem inúmeros casos em que um processo define variáveis de ambiente específicas para influenciar apenas os processos iniciados. Por exemplo, um script pode deliberadamente redefinir as configurações de localidade para os comandos iniciados, de modo que possa analisar a saída deles. Os scripts de construção para muitos pacotes de software grandes usam invocações aninhadas make
dessa coordenada entre si por meio de variáveis de ambiente. As ferramentas especializadas podem precisar alterar as condições de trabalho de outros programas iniciados, fazendo truques com $ LD_PRELOAD ou $ PATH.
Se algo que um usuário faz em uma janela diferente enquanto uma compilação longa está sendo executada em outra, apenas altera magicamente as variáveis de ambiente de todos os seus processos pelas costas, resultam em loucura e caos.
Outras variáveis de ambiente contêm informações sobre a sessão específica em que um processo é iniciado. Os programas esperam que $ TERM descreva o conjunto de comandos do terminal específico (ou emulador de terminal) ao qual estão conectados; fazer com que uma configuração geral por usuário impossibilite o logon no mesmo sistema com vários tipos diferentes de terminais. Mesmo que você tenha apenas um hardware de terminal e nunca efetue logon remotamente, programas como o screen
dependem de definir um $ TERM diferente para os processos executados em sua sessão.
Uma pergunta melhor seria: por que usamos um mecanismo de comunicação de processo para subprocesso para configurações de preferências do usuário, em vez de um banco de dados por usuário?
Resposta: Como funciona bem o suficiente e os benefícios de criar um banco de dados por usuário não são grandes o suficiente para que o trabalho de mudar tudo para usar isso em vez de variáveis de ambiente seja realizado.
(Posso pensar em muito poucas configurações de preferência em que não haveria casos de uso em que seria conveniente alterá-las apenas para executar um único script, por exemplo. Portanto, para não perder a funcionalidade, tudo ainda precisará ser substituído por variáveis de ambiente, o que resulta em maior complexidade e usuários mais confusos).
Não é como se não alternativas existem . Por exemplo, os recursos X são por sessão de exibição e não por processo. Mas eles são difíceis de acessar para programas de linha de comando - e programas de linha de comando geralmente precisam trabalhar para logins remotos que nem sequer têm um servidor X ao qual se conectar.