A questão diz tudo. Atualmente, uso o Arch Linux e o zsh, mas gostaria de uma solução que (no mínimo) funcione tanto em VTs quanto em xterms e também (espero, de preferência) continuará funcionando se eu alternar distros ou shells.
Ouvi respostas bastante díspares para essa pergunta nos documentos de diferentes distros. O Ubuntu diz "use .pam_environment". Eu acho que no Arch o que eles recomendam depende do seu shell. Atualmente, eu coloco tudo no .profile e, se um shell não obtiver essa fonte por algum motivo (por exemplo, bash se o .bash_profile existir), eu o substituo manualmente. Mas parece que deve haver uma maneira melhor.
shell
environment-variables
login
strugee
fonte
fonte
Respostas:
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 comosu -c somecommand
essh 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.export
e um único espaço (não uma guia, veja a figura).VAR=VALUE
que VAR consiste em letras, dígitos e sublinhados.#
inicia um comentário, ele não pode aparecer em um valor.'
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.=
, 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: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á-loQuando
~/.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: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
: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 é chamadorshd
ousshd
. Então você pode começar~/.bashrc
comO 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
, comoMY_ENVIRONMENT_HAS_BEEN_SET=yes
, e verifique esse protetor antes de ler~/.profile
.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.fonte
case $- in *i*)
faz?;;
ouesac
) se$-
corresponder ao padrão*i*
, ou seja, se$-
contiveri
, ou seja, se o shell for interativo.$-
é uma sequência de opções de shell definidas no momento. (comoset -x
).i
significa shell interativo.~/.config/env
, mesmo sem emulação?.profile
conformidade com conchas Bourne bastante antigas, mas reconheço que algumas pessoas simplesmente não se importam. Não tenho nada contra as pessoas supondo que sh = bash para seus próprios arquivos, só me importo se eles publicarem#!/bin/sh
scripts que usem recursos do bash.Até onde eu sei, não existe um padrão agnóstico de distribuição e shell como definir variáveis de ambiente.
O padrão mais comum e de fato parece ser
/etc/profile
e~/.profile
. O segundo mais comum parece ser/etc/environment
e~/.pam_environment
.Parece-me que toda a documentação que eu encontrei também já foi encontrada. Eu os listo aqui de qualquer maneira para os outros leitores.
/etc/profile
e~/.profile
( link )./etc/environment
e~/.pam_environment
( link )./etc/profile
e/etc/environment
( link ).Bônus: um texto questionando o uso e / ou uso indevido do
/etc/environment
debian ( link , última atualização 2008).fonte
sh
? Enquanto você se apegar ao POSIX, eu pensaria que você ficaria bem ...csh
e amigos o caminho POSIX (você precisa de algo comoset
ousetenv
)Adicionei o seguinte script ~ / bin / agnostic_setenv:
E em ~ / .perl-homedir eu uso:
Um script semelhante para agnostic_unsetenv:
fonte