/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
...)
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'}"
()
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