Quando alteramos alguma variável no ~/.profile
Ubuntu, executamos o comando source .profile
. Então a mudança é efetiva apenas neste terminal. Se abrirmos um novo terminal, precisamos executar o comando source .profile
novamente. Portanto, parece que diferentes terminais têm seu próprio ambiente, embora possam pertencer ao mesmo usuário.
Qual é a vantagem de fazer com que cada terminal tenha seu próprio caminho de ambiente? Parece que seria melhor se um terminal diferente que pertencesse ao mesmo usuário compartilhasse a mesma variável de ambiente.
environment-variables
.profile
cainiaofei
fonte
fonte
Respostas:
A razão para isso é que ela
~/.profile
é fornecida apenas por shells de login. Quando você abre uma nova janela de terminal, o shell que é iniciado é um shell sem login por padrão. Se você efetuar logoff e logon novamente, a alteração~/.profile
será efetiva em todos os seus terminais, porque~/.profile
é originada quando você faz logon na sua sessão.Não é o caso de que diferentes janelas de terminal tenham um ambiente diferente, mas esse sourcing
~/.profile
é executado apenas~/.profile
no shell atual (é exatamente isso que osource
comando faz).Por outro lado, uma alteração em
~/.bashrc
afetará imediatamente qualquer nova janela de terminal que você abrir ou qualquer shell do Bash que você digitarbash
, porque é originada por todos os shells interativos do Bash.fonte
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.
fonte