Onde é o local preferido para definir o PATH
envvar?
~/.profile
ou /etc/environment
?
Qual é o caso quando PATH
está definido em ambos os lugares? O resultado final é uma concatenação de ambos os valores definidos nesses dois locais?
Responder1
Resumo:
Se você quiser adicionar um caminho (por exemplo,
/your/additional/path
) à suaPATH
variável apenas para o usuário atual e não para todos os usuários do seu computador, normalmente você o coloca no final,~/.profile
como em um desses dois exemplos:PATH="/your/additional/path:$PATH" PATH="$PATH:/your/additional/path"
Observe que as prioridades do caminho decrescem da esquerda para a direita, portanto o primeiro caminho tem a prioridade mais alta. Se você adicionar seu caminho à esquerda de
$PATH
, ele terá a prioridade mais alta e os executáveis nesse local substituirão todos os outros. Se você adicionar seu caminho à direita, ele terá a prioridade mais baixa e os executáveis de outros locais serão preferidos.No entanto, se você precisar definir essa variável de ambiente para todos os usuários, eu ainda não recomendaria tocar,
/etc/environment
mas criar um arquivo com o nome do arquivo terminando.sh
em/etc/profile.d/
. O/etc/profile
script e todos os scripts nele contidos/etc/profile.d
são o equivalente global do pessoal de cada usuário~/.profile
e são executados como scripts de shell regulares por todos os shells durante sua inicialização.
Mais detalhes:
/etc/environment
é um arquivo de configuração de todo o sistema, o que significa que é usado por todos os usuários. Porém, ele é propriedade deroot
, então você precisa ser um usuário administrador e usá-losudo
para modificá-lo.~/.profile
é um dos scripts de inicialização de shell pessoais do seu usuário. Cada usuário possui um e pode editar seu arquivo sem afetar os outros./etc/profile
e/etc/profile.d/*.sh
são os scripts de inicialização globais equivalentes~/.profile
para cada usuário. Os scripts globais são executados antes dos scripts específicos do usuário; e o main/etc/profile
executa todos os*.sh
scripts/etc/profile.d/
antes de sair.
O
/etc/environment
arquivo normalmente contém apenas esta linha:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
Ele define a
PATH
variável para todos os usuários do sistema com esse valor padrão, que não deve ser alterado significativamente. Pelo menos você não deve remover nenhum dos caminhos importantes como ,/bin
e dele ./sbin
/usr/bin
/usr/sbin
Este arquivo é lido como um dos primeiros arquivos de configuração por cada shell de cada usuário. Observe que énão é um script de shell. É apenas um arquivo de configuração que é analisado de alguma forma e pode conter apenas atribuições de variáveis de ambiente!
O
~/.profile
arquivo pode conter muitas coisas, por padrão ele contém, entre outras coisas, uma verificação se um~/bin
diretório existe e adiciona isso àPATH
variável existente do usuário, como esta (em versões mais antigas do Ubuntu anteriores a 16.04 - que o adiciona incondicionalmente - e em 18.04 , que também adiciona "~/.local/bin"):# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
Você vê que o valor antigo de
PATH
é reutilizado aqui e o novo caminho é apenas anexado ao início, em vez de sobrescrever tudo. Quando você deseja adicionar novos caminhos manualmente, você também deve sempre manter o$PATH
valor antigo em algum lugar da nova string.Este script de inicialização é lido apenas pelos shells do usuário ao qual pertence, mas há outra condição:
# ~/.profile: executed by the command interpreter for login shells. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login # exists.
Portanto, se você usar o shell Bash padrão, certifique-se de não ter um
~/.bash_profile
ou~/.bash_login
se deseja que as alterações~/.profile
tenham efeito para o seu usuário.
Para uma compreensão completa sobre variáveis de ambiente, consulte: https://help.ubuntu.com/community/EnvironmentVariables
Pergunta relacionada:diferença entre o arquivo bash.bashrc e /etc/environment
Responder2
Esta resposta é principalmente sobrea ordem em que variáveis de ambiente como
PATH
são atribuídasquando especificado em diferentes arquivos de configuração. Também abordo onde você normalmente deve configurá-los, mas a lista abaixo não lista os arquivos na ordem em que você deve considerar usá-los. Para obter informações gerais sobre configuraçõesPATH
e outras variáveis de ambiente no Ubuntu, também recomendo a leituraVariáveis ambientaise as outras respostas a esta pergunta.
O local preferido para definir PATH
dependequais usuáriosvocê precisa configurá-lo para equando e comovocê deseja que ele seja definido. Parte da 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, recomendo configurá-lo para apenas um usuário (por exemplo, sua conta) em vez de para todo o sistema.
ComoAlexP diz, a PATH
variável de ambiente terá o valor que tinhaatribuído mais recentemente. Na prática,maioriado tempo que você definiu PATH
, você inclui ovelhovalor de PATH
no novo valor, para que as entradas anteriores sejam retidas.
Assim, na prática, quando PATH
é configurado a partir de vários arquivos, geralmente contém as entradas fornecidas em todos os arquivos. Mas isso só acontece porque todos os arquivos que a configuram, exceto o primeiro, costumam referenciar a PATH
própria variável, fazendo com que seu valor antigo seja incluído no novo.
Portanto, você está solicitando a ordem em que PATH
as configurações em vários arquivos entram em vigor.
Os locais comuns e de uso geral a serem definidos PATH
estão listados abaixo na ordem em que entram em vigor quando um usuário faz login,nãona ordem em que você normalmente deve considerar usá-los. Cada um dos locais listados abaixo é uma escolha razoável para definirPATH
emalgunssituações, mas apenas alguns são boas escolhas na maioria das vezes.
Na lista abaixo, você verá alguns nomes de diretórios como ~/.profile
. Caso você não esteja familiarizado comexpansão de til, ~/
refere-se ao diretório inicial do usuário atual. Eu uso essa sintaxe principalmente para compactação. É suportado em scripts shell, masnãonos arquivos de configuração do PAM.
1. Para todos os usuários:/etc/environment
PAMno Ubuntu faz com que as variáveis de ambiente listadas /etc/environment
sejam definidas, se esse arquivo existir, o que acontece por padrão. É assim que as variáveis de ambiente para todos os usuários são normalmente 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 paratodoscontas de usuário, em vez de apenas sua conta de usuário, então modificar esse arquivo é provavelmente sua melhor escolha. Eu recomendo fazer backup primeiro. Uma maneira de fazer backup deste arquivo é executar:
sudo cp /etc/environment /etc/environment.orig
A .orig
extensão não é especificamente necessária - você pode se sentir bem em nomear o arquivo de backup com 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 este arquivo de qualquer maneira que você editaria qualquer outro arquivo como usuário root ( sudoedit /etc/enviromnment
, sudo nano -w /etc/environment
, gksudo gedit /etc/environment
, etc.)
/etc/environment
não oferece suporte à inclusão automática do valor antigo de uma variável. Mas isso geralmente é desnecessário, já que na maioria das vezes você definiria uma variável de ambiente para todos os usuários editando /etc/environment
, você gostaria que esse fosse seu valor inicial quando o usuário fizesse login, de qualquer maneira. O usuário pode então alterá-lo como quiser. Normalmente é bom que os usuários possam 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
, especificadas com a mesma sintaxe usada em ~/.pam_environment
arquivos por usuário (veja abaixo).
Quando a mesma variável de ambiente é definida em /etc/environment
e /etc/security/pam_env.conf
, o valor in pam_env.conf
é usado - mesmo que esse valor seja especificado como DEFAULT
em vez de OVERRIDE
.
No entanto, ao substituir uma linha in environment
por uma in pam_env.conf
, você pode incluir o conteúdo do valor substituído. Consulte a seção abaixo .pam_environment
para obter detalhes (já que usa a mesma sintaxe).
Geralmente não é necessário editar pam_env.conf
evocê deve ter muito cuidado se fizer isso, desde ummalformadolinha normalmente impedirá que todas as contas de usuários normais façam login! 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 entre vários exemplos. Uma das coisas que ilustra é como dividir uma tarefa em várias linhas com \
. Suponha que você descomente 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 acidente e isso impediu que qualquer usuário fizesse login com sucesso. Para consertar, tive que inicializar no modo de recuperação e alterá-lo novamente. (Felizmente fiz isso em uma máquina virtual que uso apenas para testar coisas, então não me causou nenhum problema.)
3. Para um usuário: .pam_environment
no diretório inicial do usuário
Uma das maneiras de definir uma variável de ambiente para um único usuário é fazer com que esse usuário edite (ou crie) .pam_environment
em seu diretório inicial. Os valores definidos neste arquivo substituem aqueles definidos no /etc/environment
arquivo global.
.pam_environment
não faz parte do esqueleto de arquivos copiados para a pasta pessoal de um usuário quando a conta do 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 /etc/environment
(mas como /etc/security/pam_env.conf
), os arquivos por usuário .pam_environment
suportam a expansão do valor antigo de uma variável de ambiente para um novo. No entanto, eles não são scripts de shell e você deve usar uma sintaxe especial para conseguir isso, que difere um pouco da sintaxe que você usaria em um arquivo como .profile
.
Por exemplo, se você tivesse um bin2
diretório em seu diretório inicial que deseja adicionar ao final de PATH
, você poderia fazer isso adicionando esta linha a .pam_environment
:
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2
Vera ~/.pam_environment
subseçãodeVariáveis ambientais(do qual o exemplo acima foi adaptado),man pam_env
, eman pam_env.conf
para mais detalhes.
Embora esta já tenha sido apontada como a forma preferida para os usuários do Ubuntu alterarem ou adicionarem variáveis de ambiente e ainda seja considerada uma escolha razoável e aceitável,você deve ter cuidado ao editar.pam_environment
. Assim como as edições em todo o sistema /etc/security/pam_env.conf
(veja acima), uma linha malformada no arquivo de um usuário .pam_environment
impedirá o sucesso dos logins. (Eu testei isso - desta vez de propósito.) Para obter informações sobre comoas recomendaçõesterevoluiu, verGunnar Hjalmarssondecomentários abaixoeesta ubuntu-devel
discussão.
Tal erro é muito menos grave,em geral, do que uma linha malformada pam_env.conf
, porque afeta apenas um usuário. No entanto, no caso de um sistema desktop Ubuntu com apenas uma conta de usuário que permite logins, tal erro durante a edição .pam_environment
será tão ruim quanto um erro de edição pam_env.conf
- se você ainda não estiver logado, não será capaz para corrigi-lo sem inicializar no modo de recuperação (ou de um USB ativo, etc.).
(Se você tiver outras contas de usuário, poderá fazer login como outro usuário e corrigir o problema. Mesmo que eles não sejam administradores e não possam sudo
fazer root, eles ainda poderão executar e ser solicitados a inserir sua senha (não a deles). . Osu your-account
convidadoconta, no entanto, não pode fazer isso, pois é proibido usá-la su
para assumir a identidade de outro usuário.)
4. Para todos os usuários: /etc/profile
e arquivos dentro/etc/profile.d/
Shells compatíveis com Bourne (incluindo bash
o shell de usuário padrão no Ubuntu) executam os comandos /etc/profile
quando invocados como um shell de login.
O Ubuntu /etc/profile
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 /etc/profile.d/
diretório cujo nome termina em .sh
também sejam executados.
A maioria dos gerenciadores de exibição faz com que os comandos in /etc/profile
(e, portanto, os arquivos in /etc/profile.d
) também sejam executados para logins gráficos. No entanto,nem todos o fazem, e esse é um argumento significativo a favor do uso dos recursos fornecidos pelo PAM(veja acima) - a menos que nunca haja logins gráficos neste sistema, o que pode ser o caso, por exemplo, se for um servidor sem GUI instalada.
É tradicional definir variáveis de ambiente para todo o sistema /etc/profile
, mas muitas vezes essa não é mais a melhor escolha. Se você não puder definir uma variável de ambiente /etc/environment
e precisar configurá-la para todos os usuários, provavelmente será melhor criar um novo arquivo /etc/profile.d/
do que editá /etc/profile
-lo. Uma razão para isso é que, quando o Ubuntu é atualizado, pode haver um novo /etc/profile
arquivo padrão. Dependendo de como você executa a atualização, o arquivo antigo (com suas alterações) será mantido, deixando de lado 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 ambos /etc/profile
e em um ou mais arquivos /etc/profile.d
, qual é executada por último?Isso depende se os comandos nesse /etc/profile
conjunto aparecem antes ou depois dos arquivos profile.d
terem sido originados (pelo código que citei acima). Os comandos in /etc/profile
são executados na ordem em que aparecem.
/etc/profile
é um script de shell esua sintaxe énãoo mesmo dos arquivos de configuração PAM discutidos acima. Sua sintaxe é a mesma do ~/.profile
arquivo por usuário (veja abaixo).
Se você precisar escrever um código quedecidese deseja ou não adicionar um diretório específico PATH
(e fazê-lo para todos os usuários), você não poderá usar /etc/environment
ou /etc/security/pam_env.conf
fazer isso. Esta é talvez a principal situação em que é melhor usar /etc/profile
ou /etc/profile.d/
em vez disso.
5. Para um usuário: .bash_profile
no diretório inicial do usuário
Se um usuário tiver ~/.bash_profile
, o bash o usará em vez de ~/.profile
ou ~/.bash_login
(veja abaixo). Normalmente você não deve ter um .bash_profile
em seu diretório inicial.
Se você fizer isso, geralmente deverá conter um comando para a fonte ~/.profile
(por exemplo, . "$HOME/.profile"
). Caso contrário, o conteúdo do arquivo por usuário .profile
não será executado.
6. Para um usuário: .bash_login
no diretório inicial do usuário
Se um usuário tiver ~/.bash_login
, o bash o usará em vez de ~/.profile
(veja abaixo), a menos que ~/.bash_profile
exista, caso em que nenhum dos outros será usado, a menos que seja proveniente de `~/.bash_login.
Assim como acontece com .bash_profile
, você normalmente não deve ter um .bash_login
arquivo em seu diretório inicial.
7. Para um usuário: .profile
no diretório inicial do usuário.
Quando um shell estilo Bourne é executado como um shell de login, ele executa os comandos em /etc/profile
(que normalmente inclui comandos que fazem com que os comandos nos arquivos /etc/profile.d/
sejam executados - veja acima). Depois disso, ele executa os comandos .profile
no diretório inicial do usuário. Este arquivo é separado para cada usuário. (O Bash realmente é executado .bash_profile
ou, .bash_login
em vez disso, se existir - mas, para usuários em um sistema Ubuntu, esses arquivos raramente deveriam ou existem. Para obter detalhes, veja acima e6.2 Arquivos de inicialização Bashemo manual do Bash.)
~/.profile
é, portanto, o principal local para o usuário colocar comandos que são executados quando fazem logon. É o local tradicional para você definir seu PATH
, mas como o Ubuntu tem o módulo pam_env e suporta ~/.pam_environment
, você deve considerar usá-lo.
Assim como acontece com o /etc/profile
, nem todos os gerenciadores de exibição executam esse arquivo para logins gráficos, embora a maioria o faça.Este é um motivo para preferir ~/.pam_environment
definir variáveis de ambiente(por mais que se prefira /etc/environment
) /etc/profile
.
Você pode expandir as variáveis de ambiente, incluindo PATH
ele mesmo, ao configurá-las PATH
( .pam_environment
veja acima). No entanto, se você precisar configurar PATH
de uma forma mais sofisticada, talvez seja necessário usar o seu .profile
. Em particular, se você quiser verificar se um diretório existe sempre que um usuário fizer login e adicioná-lo apenas PATH
se existir, você não poderá usar seu .pam_environment
arquivo para adicionar esse diretório ao seu arquivo PATH
.
Por exemplo, o arquivo padrão por usuário .profile
no Ubuntucostumava serterminar com:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
VerGunnar HjalmarssondeComentesobreResposta do Byte Commanderpara detalhes.
Isso verifica se você possui um bin
subdiretório do seu diretório inicial. Nesse caso, ele adiciona esse subdiretório ao início do seu arquivo PATH
.
Essa lista omite algumas possibilidades.
Existem outras maneiras pelas quais as variáveis de ambiente são definidas quando os usuários fazem login que dependem mais do tipo de login. Por exemplo, ocasionalmente você pode ter variáveis de ambiente definidas apenas para logins gráficos ou apenas para logins remotos baseados em SSH. A lista acima não cobre esses casos.
Deixei de fora alguns arquivos onde as pessoas às vezes definem variáveis de ambiente, como ~/.bashrc
e /etc/bash.bashrc
, porque geralmente não são locais recomendados para definir PATH
e é raro que você realmente deva usá-los para essa finalidade. Se você usar esses arquivos para adicionar diretórios PATH
, às vezes eles serão adicionados muitas vezes e serão muito confusos ao examiná-los $PATH
. (Em casos extremos, isso pode atrasar as coisas, mas geralmente é apenas uma questão de manter tudo limpo e compreensível.)
Como bash
é o shell de login padrão do Ubuntu para usuários, e a maioria dos usuários o usa ou algum outro shell compatível com POSIX, omiti informações sobre como as variáveis de ambiente são definidas em outros shells que não sejam do estilo Bourne, como tcsh
.
Responder3
/etc/ambientefile não é um arquivo de script que você não pode usar para exportar e não suporta expansão de variáveis do tipo $HOME, apenas pares simplevariable=value. Portanto, para usar esse arquivo, você precisa simplesmente anexar seu caminho à definição existente, destinada especificamente a configurações de variáveis de ambiente em todo o sistema. Um por linha. Especificamente, este arquivo armazena as configurações de localidade e caminho de todo o sistema.
~/.profile- Este arquivo é executado sempre que um shell bash é executado, geralmente é o recomendado para variáveis de ambiente, porém tem a desvantagem de ser invocado apenas por shells de login, portanto, para que ele tenha efeito, você precisará fazer logout e de volta - ou pelo menos, inicie um novo shell de login.
Responder4
bash lê esses arquivos, mas zsh não:
No âmbito do sistema
/etc/profile
- Não é uma boa ideia editá-lo diretamente.
/etc/profile.d/*.sh
- fornecido por/etc/profile
em toda a sessão
~/.profile
https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh