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_environmentuma 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 somecommande 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
exporte um único espaço (não uma guia, veja a figura).
- Depois disso, cada linha deve ter a forma em
VAR=VALUEque 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_environmentfunciona 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/shcomo 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 ~/.profilenã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_loginou ~/.bash_profilese eles existem, em vez de ~/.profile. Além disso, o bash não lê ~/.bashrcem um shell de login, mesmo que seja interativo. Para nunca mais precisar se lembrar dessas peculiaridades, crie a ~/.bash_profilecom 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ê ~/.zprofilee ~/.zlogin, mas não ~/.profile. O Zsh tem uma sintaxe diferente de sh, mas pode ler ~/.profileno 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/shcomo 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 ENVvariável, se você conseguir passá-lo.
O Bash lê ~/.bashrcse não é interativo (!) E seu processo pai é chamado rshdou sshd. Então você pode começar ~/.bashrccom
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
O Zsh sempre lê ~/.zshenvquando é 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 ~/.profilenã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 ~/.profilenovamente.