Questão Como recarregar o / etc / environment sem reiniciar?


/etc/environment é oficialmente o local correto para variáveis ​​de ambiente do sistema. Mas como eu posso recarregar as atribuições neste arquivo sem reiniciar ou relogar?

Curiosamente google não me ajuda aqui, além das dezenas de posts sugerindo usar

source /etc/environment

que obviamente vai nunca trabalhe Porque /etc/environment é uma lista de atribuições (uma por linha) e não um script executável (daí a falta export comandos em /etc/environment ...)


132


origem


Em todo o sistema, não tenho ideia. Para a sessão de shell atual, você pode usar for line in $( cat /etc/environment ) ; do export $line ; done, se o formato do arquivo for key=value. - Daniel Beck♦
Funciona para mim sem um export... - Izkata
@lzkata: Se uma variável já foi exportada, não será necessário exportá-la novamente ... Se novas variáveis ​​que ainda não foram exportadas forem adicionadas, export seria necessário ... (sem isso, é apenas uma variável não-ambiente normal no shell atual, não disponível em processos filho) - Gert van den Berg
@DanielBeck obrigado..plz adicione seu comentário como resposta! - Waleed Gadelkareem
funciona também em debian e centos? - Massimo


Respostas:


Uma coisa que você está enganado é que /etc/environment requer uma reinicialização para recarregar. Isso está incorreto. A única vez que o arquivo é lido é no login, quando a pilha PAM é ativada - especificamente pam_env.so, que lê o arquivo.

Sair e voltar aplicaria as mudanças - e de fato você devo faça isso se quiser que todos os seus processos recebam o novo ambiente. Todas as outras "soluções"2 só aplicará o ambiente ao processo de shell único, mas não a qualquer coisa que você lançar através da GUI, incluindo novas janelas de terminal.1

Se você está bem com isso, porém - a falta de export comandos podem ser compensados ​​com set -a e set +a. No entanto, ainda continua sendo um caminho ruim, já que o arquivo também não usa aspas. Mas isso deve funcionar bem:

while read -r env; do export "$env"; done

1 O Gerenciador de Sessões do GNOME oferece uma maneira de alterar seu próprio ambiente, mas somente durante o Initialization Estágio:

$ gdbus call -e -d org.gnome.SessionManager \
                -o /org/gnome/SessionManager \
                -m org.gnome.SessionManager.Setenv \
                "FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
    interface is only available during the Initialization phase

2  gdb não é uma solução, mas pode ser usada às vezes. Você precisa anexá-lo aos processos em execução de seu gerenciador de sessão (por exemplo, gnome-session), o seu gestor de janelas (por ex. gnome-shell ou openbox), sua barra de tarefas / painel, se houver (por exemplo, xfce4-panel), e geralmente qualquer outra coisa que possivelmente iria executar coisas. Para cada um desses processos, você precisa anexar gdb a ele pelo PID, invocar o putenv() função usando p, em seguida, desconecte usando q:

$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6

(gdb) p putenv("FOO=bar")
$1 = 0

(gdb) p putenv("BAZ=qux")
$2 = 0

(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718

Observe que o depurador pausa o processo, portanto, você deve conectar-se aos gerenciadores de janelas de composição apenas de outro tty (console virtual) ou via SSH; caso contrário, a tela congelaria.

Além disso, você também deve atualizar o ambiente usado pelo dbus-daemon:

$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux

Para sistemas mais antigos:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()

103



Eu apenas testei enquanto lia -r env; exportar "$ env"; feito no Ubuntu 16.04 e erros. Você gostaria de mais detalhes? - Frank
o while read método lê de stdin, então você provavelmente quer enviar algo para ele (por exemplo, cat /etc/environment | while ...). Mas isso não funcionará com arquivos de ambiente formatados por citações (key="value") - villasv


Isso não é tão abrangente quanto a resposta aceita, mas se você tiver citado variáveis ​​em seu /etc/environment arquivos ambos os métodos anteriores (que usam export $line de alguma forma) vai dar errado e você acaba com valores cotados.

  • Opção 1: com um arquivo temporário de origem

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • Opção 2: com inline for (obrigado @ tim-jones):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done


5



Shorter: eval sed 's/^/export /' /etc/environment - Aaron McMillin
Versão não-temporária do arquivo acima: for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done - Tim Jones
Ainda mais curto: set -a; source /etc/environment; set +a;. - ulidtko