Infelizmente, não existe um local totalmente portátil para definir variáveis de ambiente. Os dois arquivos que mais se aproximam são ~/.profile
: o local tradicional e pronto para o uso em muitas configurações e ~/.pam_environment
uma alternativa moderna, comum, mas limitada.
O que colocar ~/.pam_environment
O arquivo ~/.pam_environment
é lido por todos os métodos de logon que usam o PAM e que têm esse arquivo ativado. Isso cobre a maioria dos sistemas Linux atualmente.
A principal vantagem ~/.pam_environment
é que (quando ativada) é lida antes do início do shell do usuário e, portanto, funciona independentemente do tipo de sessão, shell de login e outras complexidades. Até funciona para logins não interativos como su -c somecommand
e ssh somecommand
.
A principal limitação ~/.pam_environment
é que você só pode colocar atribuições simples lá, não sintaxe de shell complexa. A sintaxe deste arquivo é a seguinte.
- Os arquivos são analisados linha por linha.
- Os espaços em branco à esquerda são ignorados.
- Opcionalmente, você pode iniciar linhas com
export
e um único espaço (não uma guia, veja a figura).
- Depois disso, cada linha deve ter a forma em
VAR=VALUE
que VAR consiste em letras, dígitos e sublinhados.
#
inicia um comentário, ele não pode aparecer em um valor.
- Se VALUE começar com
'
ou "
e contiver outra cotação idêntica, VAR será definido como a string entre as aspas (tudo após a segunda cotação ser ignorado). Caso contrário, o VAR é definido como a sequência após o =
sinal.
- Se não houver
=
, a variável é removida do ambiente.
Então, de cabeça para baixo, ~/.pam_environment
funciona em uma grande variedade de circunstâncias. Por outro lado, você não pode ter configurações dinâmicas, como basear o valor de uma variável em outra variável (por exemplo, adicionar um diretório ao PATH) ou usar a saída de um comando (por exemplo, testar se um diretório ou programa está presente) e alguns caracteres ( #'"
, nova linha) são impossíveis ou problemáticos de colocar o valor.
O que colocar ~/.profile
Este arquivo deve ter sintaxe sh portátil (POSIX). Use somente extensões ksh ou bash (matrizes, [[ … ]]
etc.) se você souber que seu sistema possui esses shells como /bin/sh
.
Esse arquivo pode ser lido por scripts em aplicativos automatizados, portanto, não deve chamar programas que produzam qualquer saída ou chamada exec
. Se você quiser fazer isso em logons no modo de texto, faça-o apenas para shells interativos. Exemplo:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
Este é um exemplo de uso /bin/sh
como seu shell de login e alternar para o seu shell favorito. Veja também como posso usar o bash como meu shell de login quando meu sysadmin se recusa a me permitir alterá-lo
Quando ~/.profile
não é lido no login não gráfico?
Shell de login diferentes leem arquivos diferentes.
Se o seu shell de login for bash
O Bash lê ~/.bash_login
ou ~/.bash_profile
se eles existem, em vez de ~/.profile
. Além disso, o bash não lê ~/.bashrc
em um shell de login, mesmo que seja interativo. Para nunca mais precisar se lembrar dessas peculiaridades, crie a ~/.bash_profile
com as duas linhas a seguir:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Consulte também Quais arquivos de instalação devem ser usados para configurar variáveis de ambiente com o bash?
Se o seu shell de login for zsh
Zsh lê ~/.zprofile
e ~/.zlogin
, mas não ~/.profile
. O Zsh tem uma sintaxe diferente de sh, mas pode ler ~/.profile
no modo de emulação sh. Você pode usar isso para o seu ~/.zprofile
:
emulate sh -c '. ~/.profile'
Veja também Zsh não atingindo ~ / .profile
Se o seu shell de login for algum outro shell
Não há muito o que fazer lá, além de usar /bin/sh
como seu shell de login e seu shell favorito (como peixe) apenas como um shell interativo. É o que eu faço com o zsh. Veja acima um exemplo de como chamar outro shell de ~/.profile
.
Comandos remotos
Ao chamar um comando remoto sem passar por um shell interativo, nem todos os shells lêem um arquivo de inicialização.
O Ksh lê o arquivo especificado pela ENV
variável, se você conseguir passá-lo.
O Bash lê ~/.bashrc
se não é interativo (!) E seu processo pai é chamado rshd
ou sshd
. Então você pode começar ~/.bashrc
com
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
O Zsh sempre lê ~/.zshenv
quando é iniciado. Use com cuidado, pois isso é lido por todas as instâncias do zsh, mesmo quando é um subshell em que você definiu outras variáveis. Se zsh é seu shell de login e você deseja usá-lo para definir variáveis apenas para comandos remotos, use um protetor: defina algumas variáveis ~/.profile
, como MY_ENVIRONMENT_HAS_BEEN_SET=yes
, e verifique esse protetor antes de ler ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
O caso de logins gráficos
Muitas distribuições, gerenciadores de exibição e ambientes de desktop organizam a execução ~/.profile
, fornecendo explicitamente os scripts de inicialização ou executando um shell de login.
Infelizmente, não existe um método geral para lidar com combinações distro / DM / DE onde ~/.profile
não é lido.
Se você usar uma sessão tradicional iniciada por ~/.xsession
, este é o local em que você deve definir suas variáveis de ambiente; faça isso por meio de sourcing ~/.profile
(ie . ~/.profile
). Observe que, em algumas configurações, os scripts de inicialização do ambiente de área de trabalho serão originados ~/.profile
novamente.