Definindo variável de ambiente global para todos

17

Se eu definir uma variável em /etc/environment, ele só parece aplicar-se aos administradores, enquanto no sudo su.

Como posso obter as variáveis ​​para aplicar a todos? Especialmente quando eles estão no terminal? As configurações /etc/enviromentnão se aplicam ao bash?

Mick.D
fonte

Respostas:

13

A /etc/environmentatualização funcionará apenas na próxima sessão, não será recarregada automaticamente.

O que significa que você não pode alterá-lo para sessões que já foram iniciadas para outros usuários.

Se você deseja "recarregar" o que estiver no /etc/environmentarquivo, precisará do seguinte comando:

source /etc/environment

Mas, novamente, ele funcionará apenas para sua própria sessão atual; outros usuários não serão afetados até que iniciem uma nova sessão ou executem o comando acima em sua própria sessão.

Panthro
fonte
4

TL; DR

Esses arquivos de configuração, sejam globais ( /etc/environment, /etc/profile) ou específicos do usuário ( ~/.profile, ~/.bashrc) , são processados ​​apenas no próximo login / sessão.

Os arquivos globais se aplicam a todos os usuários (não apenas à raiz) ... mas você precisa reiniciar sua sessão de login para ver as mudanças refletidas no ambiente. Isso pode acontecer ligando sucomo você observou ... ou desconectando / iniciando ou reiniciando. Você poderia supara um usuário não root e veria que eles também têm alterações no ambiente.

A razão pela qual você precisa reiniciar ou fazer login novamente para obter o ambiente global é porque o ambiente é herdado dos processos-pai e o processo raiz de tudo o que você executa é o seu shell de login ... portanto, se o seu shell de login não tiver o ambiente ... os processos também não foram iniciados no shell de login. É claro que você pode definir / atualizar o ambiente para processos individuais à medida que os inicia, mas seria necessário definir o ambiente para o shell de login e reiniciar todos os subprocessos para que eles vissem a alteração.

Ambiente global

Como alguém referiu, você precisa de um reboot ou o logout / login para as alterações /etc/profile, /etc/profile.d/*.she /etc/environmentpara ser apanhada.

Isso ocorre porque, embora esses arquivos especifiquem o ambiente global ... eles são executados apenas uma vez no logon e, portanto, os logins / sessões existentes não refletirão alterações nesses arquivos. Uma reinicialização "redefine" o logon de todos, forçando-os a buscar o novo ambiente.

Na sua própria sessão de logon, você pode source /etc/profile, a fim de capturar as alterações sem uma reinicialização ou logout / logon ... mas isso afetará apenas sua própria sessão e os novos processos em execução na sua sessão.

Observe também que não há interpolação de variáveis /etc/environment(não é um script); portanto, você não pode fazer coisas como essa PATH="$PATH:/my/custom/path".

Observe também que /etc/profilee /etc/profile.d/*.shsão executados apenas para sessões de login e, portanto, o ambiente configurado não estará disponível para as contas de não login do sistema (ou seja, se você estiver tentando definir uma variável de ambiente para um processo daemon que é executado fora do seu shell de login).

Nota que bashrcnão é útil para definir o ambiente para todo o shell de login, mas para os reservatórios festança e processos sub ... então para a verdadeira "global" ou "user global" você provavelmente vai querer colocar o seu ambiente config na /etc/profileou /etc/profile.d/my-custom-env.shou ~/.profile. Outros shells (por exemplo, zsh) têm seus próprios arquivos de configuração e, portanto, a configuração de ambiente não específico do bash em um bashrc causará problemas ou confusão se / quando você trocar de shells (ou tiver outros usuários no sistema usando shells diferentes).

É um problema comum instalar um novo programa e precisa especificar algum ambiente para que ele funcione corretamente. O ambiente global é uma resposta, mas geralmente exige uma reinicialização que não é ideal para servidores e casos de uso de provisionamento / configuração automática. Você deve se perguntar se essa é realmente uma variável que todos os usuários e programas no sistema precisam ou se é realmente apenas algo que você precisa disponibilizar para um usuário ou programa específico.

Para usuário específico

observe a inclusão do ambiente no perfil ou no bashrc no diretório inicial do usuário (por exemplo ~/.profile ~/.bashrc), dependendo se você deseja isso para interativo, shells de login, somente bash, etc.

Lembre-se de que isso também requer uma reinicialização ou logout / logon para que as alterações no ambiente estejam disponíveis para todos os processos na sessão de logon do usuário. O usuário pode source ~/.profile... mas isso é feito em um terminal e atualiza apenas o ambiente nessa sessão do terminal e nos processos filho ... não necessariamente para todo o ambiente de login do usuário.

Para um programa específico, existem algumas opções.

Um é apenas fornecer o ambiente ao executar o comando:

VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2

Se você estiver usando systemd você também pode especificar o ambiente no arquivo unidade / serviço sob [Service]comEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE

Essa opção pode parecer desajeitada porque você precisa especificar o ambiente toda vez que executa um programa, mas se o ambiente for realmente necessário apenas por esse programa ... essa é realmente a melhor maneira e você deve se acostumar e não despejar tudo em um arquivo bashrc ou de perfil.

Se você não estiver usando systemd ou init para configurar o ambiente e executar o programa ... é claro que também pode envolver a execução do programa com um script bash, onde salva o comando completo, incluindo a configuração do ambiente por conveniência.

Referências:

Também há uma resposta muito detalhada aqui que sugiro que você leia: /ubuntu//a/247769/824160

mattpr
fonte
3

crie um script de shell customizado em

/etc/profile.d/

adicione suas variáveis ​​de ambiente global dentro do script criado, reinicie a máquina e ela estará disponível para todos.

shalamus
fonte
Acredito que essa é uma abordagem mais confiável do que editar o arquivo / etc / environment, pois esse arquivo pode ser alterado à medida que os pacotes são atualizados.
Phreed 12/02/19
2

A adição de uma variável para /etc/environmentfuncionou para mim.

No entanto, tive que reiniciar após a alteração /etc/environmentpara que a alteração entre em vigor. Simplesmente fechar e reabrir a janela do terminal não era suficiente.

kris
fonte
3
Você sempre pode fazer um source /etc/environmentpara recarregá-lo.
Panthro
Sair e voltar a entrar deve ser suficiente.
Karuhanga