Esta resposta é principalmente sobre a ordem na qual variáveis de ambiente como PATH
são atribuídas quando especificadas em arquivos de configuração diferentes. Eu também abordo onde normalmente você deve configurá-los, mas a lista abaixo não lista os arquivos na ordem em que você deve considerá-los. Para informações gerais sobre como configurar PATH
e outras variáveis de ambiente no Ubuntu, também recomendo a leitura de EnvironmentVariables e as outras respostas a esta pergunta.
O local preferido para definir PATH
depende de quais usuários você precisa defini-lo e quando e como você deseja que ele seja configurado. Parte de sua decisão será se você deseja uma variável de ambiente definida para todos os usuários ou por usuário. Se você não tiver certeza, recomendamos configurá-lo para apenas um usuário (por exemplo, sua conta) em vez de todo o sistema.
Como AlexP diz , o PATH
variável de ambiente terá o valor que foi atribuído mais recentemente . Na prática, mais da hora em que você define PATH
, inclua o valor antigo de PATH
no novo valor, para que as entradas anteriores sejam mantidas. / p>
Assim, na prática, quando PATH
é definido a partir de vários arquivos, ele geralmente contém as entradas fornecidas em todos os arquivos. Mas isso só acontece porque todos os arquivos que o definem, exceto o primeiro, geralmente fazem referência à própria variável PATH
, fazendo com que seu valor antigo seja incluído no novo.
Portanto, você está, na verdade, pedindo a ordem na qual as configurações de PATH
em vários arquivos entrem em vigor.
Locais comuns de uso geral para definir PATH
estão listados abaixo na ordem em que eles entram em vigor quando um usuário faz login, não na ordem em que você normalmente deve considerar o uso eles . Cada um dos lugares listados abaixo é uma opção razoável para definir PATH
em algumas situações , mas apenas algumas são boas escolhas na maior parte do tempo.
Na lista abaixo, você verá alguns nomes de diretório como ~/.profile
. Caso você não esteja familiarizado com a expansão do til , ~/
refere-se à diretório inicial do usuário atual. Eu principalmente uso esta sintaxe para compacidade. É suportado em scripts de shell, mas não nos arquivos de configuração do PAM.
1. Para todos os usuários: /etc/environment
PAM no Ubuntu faz com que as variáveis de ambiente listadas em /etc/environment
sejam definidas, se esse arquivo existir, que por padrão isso acontece. É assim que as variáveis de ambiente para todos os usuários são mais comumente definidas.
$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
Se você precisar definir variáveis de ambiente para todas contas de usuário, em vez de apenas sua conta de usuário, a modificação desse arquivo provavelmente será sua melhor escolha. Eu recomendo fazer o backup primeiro. Uma maneira de fazer backup desse arquivo é executar:
sudo cp /etc/environment /etc/environment.orig
A extensão .orig
não é especificamente necessária - você pode se sentir bem ao nomear o arquivo de backup de qualquer coisa que não seja confusa ou que já esteja sendo usada. (Além de .orig
, .old
, .backup
e .bak
são comuns.)
Você pode editar esse arquivo de qualquer maneira que você possa editar qualquer outro arquivo como o usuário raiz ( sudoedit /etc/enviromnment
, sudo nano -w /etc/environment
, gksudo gedit /etc/environment
, etc.)
/etc/environment
não suporta incluir o valor antigo de uma variável automaticamente. Mas isso geralmente é desnecessário, já que na maioria das vezes você configuraria uma variável de ambiente para todos os usuários editando /etc/environment
, você desejaria que esse fosse seu valor inicial quando o usuário efetuasse login, de qualquer forma. O usuário pode então alterá-lo como quiser. Normalmente, é bom que os usuários consigam fazer isso.
2. Para todos os usuários: /etc/security/pam_env.conf
O PAM lê variáveis de ambiente para todos os usuários de /etc/security/pam_env.conf
, especificado com a mesma sintaxe usada nos arquivos por usuário ~/.pam_environment
(veja abaixo).
Quando a mesma variável de ambiente é definida em /etc/environment
e /etc/security/pam_env.conf
, o valor em pam_env.conf
é usado - mesmo que esse valor seja especificado como DEFAULT
em vez de OVERRIDE
.
No entanto, quando você substitui uma linha em environment
por uma em pam_env.conf
, você pode incluir o conteúdo do valor substituído. Veja a seção abaixo sobre .pam_environment
para detalhes (já que usa a mesma sintaxe).
Geralmente, não é necessário editar pam_env.conf
e você deve ser muito cuidadoso se fizer , pois uma linha malformada geralmente impede que todas as contas de usuário normais façam login em absoluto! Por exemplo, o padrão pam_env.conf
contém as linhas:
#PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Isto é apresentado como um dos vários exemplos. Uma das coisas que ilustra é dividir uma tarefa em várias linhas com \
.Suponha que você tenha começado a descomentar apenas a primeira linha, mas esqueceu de descomentar a segunda linha:
PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Não faça isso!
Acabei de testar isso por conta própria e isso impediu que usuários fizessem login com sucesso. Para corrigi-lo, eu tive que inicializar no modo de recuperação e alterá-lo de volta. (Felizmente eu fiz isso em uma máquina virtual que eu uso apenas para testar as coisas, então não me causou nenhum problema).
3. Para um usuário: .pam_environment
no diretório pessoal do usuário
Uma das maneiras de definir uma variável de ambiente para um único usuário é para esse usuário editar (ou criar) .pam_environment
em seu diretório inicial. Os valores definidos neste arquivo substituem os definidos no arquivo global /etc/environment
.
.pam_environment
não faz parte do esqueleto de arquivos que são copiados na pasta base de um usuário quando a conta de usuário é criada inicialmente. No entanto, se você criar esse arquivo em seu diretório inicial, poderá usá-lo para definir variáveis de ambiente como PATH
. Ao contrário de /etc/environment
(mas como /etc/security/pam_env.conf
), os arquivos por usuário co_de% suportam a expansão do valor antigo de uma variável de ambiente para uma nova. Eles não são scripts de shell, no entanto, e você deve usar uma sintaxe especial para conseguir isso, o que difere um pouco da sintaxe que você usaria em um arquivo como .pam_environment
.
Por exemplo, se você tivesse um directório%% co_de em seu diretório home que você queria acrescentar ao final de .profile
, você poderia fazer isso adicionando esta linha para bin2
:
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2
Consulte o PATH
subseção de EnvironmentVariables (a partir do qual o exemplo acima é estreitamente adaptado), .pam_environment
e ~/.pam_environment
para mais detalhes.
Embora isso já tenha sido apontado como a maneira preferida para os usuários do Ubuntu alterarem ou adicionarem variáveis de ambiente e ainda ser considerada uma escolha razoável e aceitável, você deve ter cuidado ao editar man pam_env
. Como as edições no sistema man pam_env.conf
(veja acima), uma linha malformada no arquivo .pam_environment
do usuário impedirá o sucesso dos logins. (Eu testei isso - de propósito desta vez.) Para obter informações sobre como as recomendações Tem evoluiu , consulte 's Gunnar Hjalmarsson abaixo e esta /etc/security/pam_env.so
discussão .
Esse erro é muito menos sério, em geral , do que uma linha malformada em .pam_environment
, porque afeta apenas um usuário. No entanto, no caso de um sistema Ubuntu desktop com apenas uma conta de usuário que permite logins, tal erro durante a edição ubuntu-devel
será tão ruim quanto um erro de edição pam_env.so
- se você ainda não está logado, você não poderá consertá-lo sem inicializar no modo de recuperação (ou de um USB ativo, etc.).
(Se você tem outras contas de usuário, então você pode logar como outro usuário e corrigir o problema. Mesmo se não for um administrador e não pode .pam_environment
a raiz, eles ainda podem executar pam_env.so
e ser solicitado a digitar sua (não a sua) de senha. o convidado conta, no entanto, não pode fazer isso, pois está proibido de usar sudo
para assumir a identidade de outro usuário.)
4. Para todos os usuários: su your-account
e arquivos dentro de su
Shells compatíveis com Bourne (incluindo /etc/profile
, o shell de usuário padrão no Ubuntu) executam os comandos em /etc/profile.d/
quando invocados como um shell de login.
O bash
do Ubuntu termina com:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Isso faz com que os comandos em qualquer arquivo no diretório /etc/profile
cujo nome termine em /etc/profile.d
sejam executados também.
A maioria dos gerenciadores de exibição faz com que os comandos em /etc/profile.d/
(e, portanto, arquivos em .sh
) sejam executados para logins gráficos também. No entanto, nem todos fazem, e isso é um argumento significativo a favor de usar as facilidades oferecidas pelo PAM em vez (veja acima) - a não ser que nunca haverá quaisquer logins gráficas para este sistema, que pode ser o caso, por exemplo, se é um servidor sem GUI instalado.
É tradicional definir variáveis de ambiente em todo o sistema em /etc/profile
, mas essa não é a melhor escolha. Se você não puder definir uma variável de ambiente em /etc/profile.d
e precisar defini-la para todos os usuários, provavelmente será melhor criar um novo arquivo em /etc/profile
do que editar /etc/environment
em si.Uma razão para isso é que, quando o Ubuntu é atualizado, pode haver um novo arquivo /etc/profile.d/
padrão. Dependendo de como você realizar a atualização, o arquivo antigo (com suas alterações) será mantido, precedendo o arquivo de configuração atualizado específico, ou você será solicitado a lidar com a situação.
Quando a mesma variável de ambiente é definida em /etc/profile
e um ou mais arquivos em /etc/profile
, o que é executado por último? Isso depende se os comandos em /etc/profile
os definem aparecer antes ou depois dos arquivos em /etc/profile.d
terem sido originados (pelo código que citei acima). Os comandos em /etc/profile
são executados na ordem em que aparecem.
profile.d
é um script de shell e sua sintaxe não é a mesma dos arquivos de configuração do PAM discutidos acima . Sua sintaxe é igual à sintaxe do arquivo por usuário /etc/profile
(veja abaixo).
Se você precisar escrever código que decida se deseja ou não adicionar um diretório específico a /etc/profile
(e fazer isso para todos os usuários), você não poderá usar ~/.profile
ou PATH
para fazer isso. Esta é talvez a principal situação em que é melhor usar /etc/environment
ou /etc/security/pam_env.conf
.
5. Para um usuário: /etc/profile
no diretório pessoal do usuário
Se um usuário tiver /etc/profile.d/
, o bash o usará em vez de .bash_profile
ou ~/.bash_profile
(veja abaixo). Normalmente, você não deve ter um ~/.profile
em seu diretório pessoal.
Se você fizer isso, normalmente deve conter um comando para obter a origem ~/.bash_login
(por exemplo, .bash_profile
). Caso contrário, o conteúdo do arquivo por usuário ~/.profile
não será executado.
6. Para um usuário: . "$HOME/.profile"
no diretório pessoal do usuário
Se um usuário tiver .profile
, o bash o usará em vez de .bash_login
(veja abaixo), a menos que ~/.bash_login
exista, caso em que nenhum dos outros será usado, a menos que seja originado de '~ / .bash_login. / p>
Assim como no caso de ~/.profile
, você normalmente não deve ter um arquivo ~/.bash_profile
em seu diretório pessoal.
7. Para um usuário: .bash_profile
no diretório pessoal do usuário.
Quando um shell estilo Bourne é executado como um shell de login, ele executa os comandos em .bash_login
(que normalmente inclui comandos que fazem com que os comandos em arquivos em .profile
sejam executados - veja acima). Depois disso, ele executa os comandos em /etc/profile
no diretório pessoal do usuário. Este arquivo é separado para cada usuário. (Bash na verdade usa /etc/profile.d/
ou .profile
se eles existirem - mas, para usuários em um sistema Ubuntu, esses arquivos raramente deveriam existir ou existem. Para detalhes, veja acima e 6.2 Arquivos de Inicialização Baseada em Bash em o manual de Bash .)
.bash_profile
é, portanto, o local principal para o usuário colocar comandos que são executados quando eles fazem logon. É o lugar tradicional para você definir seu .bash_login
, mas como o Ubuntu tem o módulo pam_env e suporta ~/.profile
, você deve considerar usar isso.
Assim como no caso de PATH
, nem todos os gerenciadores de exibição executam esse arquivo para logins gráficos, embora a maioria faça isso. Esse é um motivo para preferir ~/.pam_environment
para definir variáveis de ambiente (da mesma forma que se pode preferir /etc/profile
a ~/.pam_environment
).
Você pode expandir variáveis de ambiente, incluindo /etc/environment
, quando você define /etc/profile
em PATH
(veja acima). No entanto, se você precisar definir PATH
de uma maneira mais sofisticada, talvez seja necessário usar seu .pam_environment
. Em particular, se você quiser verificar se existe um diretório toda vez que um usuário efetua login e apenas o adiciona a PATH
, se não, você não poderá usar o arquivo .profile
para adicionar esse diretório ao seu diretório. PATH
.
Por exemplo, o arquivo padrão por usuário .pam_environment
no Ubuntu usado para termina com:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Veja Gunnar Hjalmarsson 's comentário em Byte Resposta do comandante para detalhes.
Isso verifica se você tem um subdiretório PATH
do seu diretório pessoal. Em caso afirmativo, ele adiciona esse subdiretório ao início de seu .profile
.
Essa lista omite algumas possibilidades.
Existem outras maneiras pelas quais variáveis de ambiente são definidas quando os usuários efetuam login que dependem mais do tipo de login. Por exemplo, você pode ocasionalmente ter variáveis de ambiente que são configuradas apenas para logins gráficos ou apenas para logons remotos baseados em SSH. A lista acima não abrange esses casos.
Deixei de fora alguns arquivos em que as pessoas às vezes definem variáveis de ambiente, como bin
e PATH
, porque geralmente não são lugares recomendados para definir ~/.bashrc
e é raro usá-los para este propósito. Se você usar esses arquivos para adicionar diretórios a /etc/bash.bashrc
, eles às vezes serão adicionados muitas vezes e ficará muito confuso quando você examinar PATH
. (Em casos extremos isso pode atrasar as coisas, mas geralmente é apenas uma questão de manter tudo limpo e compreensível.)
Como PATH
é o shell de login padrão do Ubuntu para usuários, e a maioria dos usuários o utiliza ou algum outro shell compatível com POSIX, omiti as informações sobre como as variáveis de ambiente são definidas em outros shells não Bourne. $PATH
.