Definindo uma variável de ambiente para todos os logins (independentemente do tipo)
A melhor maneira é usar ~/.pam_environment
. Por exemplo, para adicionar /opt/blah/bin
ao final de sua PATH
, você colocaria isso no arquivo .pam_environment
no seu diretório pessoal:
PATH DEFAULT=${PATH}:/opt/blah/bin
Definindo Variáveis de Ambiente Globalmente (mas não faça isso a menos que seja necessário)
Se você quiser adicionar algo ao PATH
para todos os usuários , use /etc/environment
. Confusamente, /etc/environment
e ~/.pam_environment
não usam a mesma sintaxe. Embora nenhum deles seja realmente um script, /etc/environment
parece um script ( sem nenhum comando export
). Então, se você quiser adicionar /opt/blah/bin
ao final de todo mundo PATH
, e a PATH
linha em /etc/environment
começou como
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
você mudaria para:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/blah/bin"
Análise
A maioria dos shells no estilo Bourne, incluindo bash
, irá fornecer ~/.profile
quando eles forem iniciados como um shell de login. zsh
é uma exceção incomum; ele só fará isso se for invocado com o nome de uma das shells tradicionais ao estilo Bourne. Ou seja, se você chamar zsh
pelo nome sh
ou ksh
(mais comumente obtido criando um link simbólico para zsh
com um desses nomes), ele se comportará como eles e fonte ~/.profile
(se for um shell de login). Caso contrário, não será. (Fonte: man zsh
.)
É por isso que zsh
em uma sessão console virtual (por exemplo, onde você vai para Ctrl + Alt + F1 ) não define a variável de ambiente PATH
de ~/.profile
. É um shell de login, mas zsh
é especial; ela não se comporta como conchas tradicionais ao estilo Bourne, a menos que esteja fingindo ser uma.
Por que zsh
executando uma janela do Terminal tem as variáveis de ambiente definidas em ~/.profile
? Porque eles já estavam configurados na sua sessão gráfica antes de você iniciar o Terminal . Quando você faz login graficamente, o gerenciador de exibição (que fornece a tela de login gráfica e gerencia as sessões gráficas) age como um shell de login. Geralmente, ele obtém ~/.profile
(embora não seja garantido que o faça, e ocasionalmente alguém altera os ambientes de área de trabalho apenas para descobrir que ~/.profile
não é mais fornecido quando eles fazem login graficamente). / p>
Não há nada sobre consoles virtuais baseados em texto que faz com que ~/.profile
não seja originado. Por exemplo, se seu shell fosse bash
em vez de zsh
e você estivesse conectado em um console virtual, ~/.profile
seria originado. A questão é que, ao contrário do comportamento confiável de um shell tradicional estilo Bourne, e o comportamento não tão confiável de um gerenciador de exibição ao iniciar uma sessão de login gráfica, zsh
não origina ~/.profile
quando for seu shell de login. / p>
Da mesma forma, com as variáveis de ambiente definidas em ~/.profile
, se você fizesse login remotamente (por exemplo, ativando o SSH e registrando dessa maneira), ~/.profile
não seria originado.
Isso se aplica também ao arquivo global /etc/profile
, por sinal. Se você definir variáveis de ambiente globalmente, você perceberá o mesmo comportamento que está vendo as variáveis de ambiente de configuração para seu usuário em ~/.profile
.
A solução, desde que você não precise escrever um teste com script para determinar o conteúdo de suas variáveis de ambiente , é definir variáveis de ambiente específicas do usuário em ~/.pam_environment
e em todo o sistema , para todos os usuários) variáveis de ambiente em /etc/environment
.
Quando você faz isso, PAM (especificamente, pam_env.so
) define as variáveis no login, basicamente para cada tipo de login, e faz isso antes o shell de login (por exemplo, zsh
, bash
para a maioria das pessoas) ou coisa semelhante a um shell de login (por exemplo, um gerenciador de exibição) origina seus próprios arquivos de configuração de login. Esta é a maneira geralmente recomendada de definir variáveis de ambiente no Ubuntu atualmente .
Desta forma, resolve-se o problema de algumas shells de login que nem sempre obtêm ~/.profile
e /etc/profile
(que é o problema que você está enfrentando). Ele também resolve o problema ocasional de um gerenciador de exibição não fornecer esse arquivo à medida que ele inicializa uma sessão de login gráfica (esse é um problema que você não está experimentando).
Alternativas
E se:
- você precisa definir variáveis de ambiente no login, com base nos resultados de testes com script? Ou
- você não quer usar
.pam_environment
(ou para variáveis de todo o sistema, /etc/environment
?
Se você não estava usando zsh
, mas em vez disso usou bash
ou outro shell estilo tradicional mais Bourne, você poderia definir suas variáveis de ambiente em ~/.profile
(ou /etc/profile
para variáveis do sistema). Ocasionalmente, há uma configuração em que isso não é configurado para sessões de login gráficas, mas geralmente funciona.
Defini-las em ~/.bashrc
não funcionará para este fim . Essencialmente apenas bash
sources que arquiva, então ele não funcionará nem quando zsh
é seu shell de login nem quando o gerenciador de exibição age como seu shell de login. (Em outras palavras, na sua situação, isso nunca funcionará).
Assim, se você precisar de um script originado para todos os tipos de login, e ~/.profile
estiver sendo originado para suas sessões gráficas, você pode simplesmente:
- modificar a configuração de
zsh
para a origem ~/.profile
, ou
- faça a configuração de
zsh
e ~/.profile
forneça um terceiro arquivo compartilhado. (Isso pode até ser adicionado a um arquivo de configuração separado para sessões gráficas, como .xsession
, se isso para ser necessário mais tarde.)
Dessas duas opções, a segunda é melhor, a menos que você tenha lido o conteúdo de ~ / .profile and made sure they--and the contents of any script sourced from
.profile --won't cause problems if sourced by
zsh '. (Geralmente não deveria, mas você nunca sabe.)
O melhor arquivo de configuração a ser modificado, para tornar zsh
source ~/.profile
(ou algum outro script) no login, é ~/.zprofile
. Isso corresponde a ~/.profile
em shells mais tradicionais ao estilo Bourne. (Estritamente falando, é $ZDOTDIR/.zprofile
, mas $ZDOTDIR
é normalmente ~
.)
Você adicionaria a linha source $HOME/.profile
a esse arquivo.
Eu enfatizo, no entanto, que se precisar executar uma atribuição simples para variáveis de ambiente (incluindo atribuição recursiva onde uma variável de ambiente é atribuída a uma expressão contendo ela mesma e / ou outras variáveis de ambiente), você deve usar ~/.pam_environment
como explicado acima (ou /etc/environment
para variáveis de ambiente em todo o sistema).