Onde é o local preferido para definir o ambiente PATH
?
~/.profile
ou /etc/environment
?
Qual é o caso quando PATH
é definido nos dois lugares? O resultado final é uma concatenação de ambos os valores definidos nesses dois lugares?
Onde é o local preferido para definir o ambiente PATH
?
~/.profile
ou /etc/environment
?
Qual é o caso quando PATH
é definido nos dois lugares? O resultado final é uma concatenação de ambos os valores definidos nesses dois lugares?
Respostas:
Resumo:
Se você deseja adicionar um caminho (por exemplo /your/additional/path
) à sua PATH
variável apenas para o usuário atual e não para todos os usuários do seu computador, você normalmente o coloca no final de ~/.profile
um desses dois exemplos:
PATH="/your/additional/path:$PATH"
PATH="$PATH:/your/additional/path"
Observe que as prioridades do caminho estão descendo 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 maior prioridade e os executáveis nesse local substituirão todos os outros. Se você adicionar seu caminho à direita, ele terá a menor prioridade 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, ainda não recomendaria tocar, /etc/environment
mas criar um arquivo com o nome do arquivo terminado .sh
em /etc/profile.d/
. O /etc/profile
script e todos os scripts inseridos /etc/profile.d
são o equivalente global do pessoal de cada usuário ~/.profile
e são executados como scripts shell regulares por todos os shells durante sua inicialização.
Mais detalhes:
/etc/environment
é um arquivo de configuração em todo o sistema, o que significa que é usado por todos os usuários. Ele pertence a ele root
, portanto, você precisa ser um usuário administrador e usá sudo
-lo para modificá-lo.
~/.profile
é um dos scripts de inicialização do shell pessoal do seu usuário. Todo usuário tem um e pode editar seu arquivo sem afetar os outros.
/etc/profile
e /etc/profile.d/*.sh
são os scripts de inicialização global equivalentes a ~/.profile
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 no sistema para esse valor padrão, que não deve ser alterado de maneira importante. Pelo menos você não deve remover qualquer um dos caminhos importantes, como /bin
, /sbin
, /usr/bin
e /usr/sbin
a partir dele.
Este arquivo é lido como um dos primeiros arquivos de configuração por todos os shell de todos os usuários. Observe que não é um script de shell . É apenas um arquivo de configuração que é analisado de alguma forma e que 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 da existência de um ~/bin
diretório e a adiciona à PATH
variável existente do usuário , desta forma (em versões mais antigas do Ubuntu anteriores ao 16.04 - o que inclui incondicionalmente - e no 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 é anexado apenas ao início, em vez de sobrescrever tudo. Quando você deseja adicionar novos caminhos manualmente, também deve sempre manter o $PATH
valor antigo em algum lugar da nova string.
Esse script de inicialização é lido apenas pelos shells do usuário ao qual ele 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, verifique se não possui um ~/.bash_profile
ou ~/.bash_login
se deseja que as alterações ~/.profile
tenham um efeito para o usuário.
Para um entendimento completo sobre variáveis de ambiente, consulte: https://help.ubuntu.com/community/EnvironmentVariables
Pergunta relacionada: diferença entre o arquivo bash.bashrc e / etc / environment
~/.profile
não verifica a existência de ~/bin
, mas simplesmente tem a seguinte linha:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
/etc/skel/.profile
no 16.04 tem a linha que eu mencionei. Aparentemente, você criou seu usuário em uma versão anterior.
~/.profile
ainda tinha isso também, mas você está certo - /etc/skel/.profile
não o possui no meu sistema 16.04 atualizado (e uma conta de usuário criada ao instalar o 16.04 no outra máquina não a possui .profile
).
Esta resposta é principalmente sobre a ordem na qual variáveis de ambiente como
PATH
são atribuídas quando especificadas em diferentes arquivos de configuração. Também abordo onde você costuma defini-los, mas a lista abaixo não lista os arquivos na ordem em que você deve considerá-los. Para obter informações gerais sobre configuraçãoPATH
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 definir e quando e como deseja que seja definido. Parte de sua decisão será se você deseja definir uma variável de ambiente 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) e não para todo o sistema.
Como AlexP diz , a PATH
variável de ambiente terá o valor que foi atribuído mais recentemente . Na prática, na maioria das vezes que você define PATH
, você inclui o valor antigo de PATH
no novo valor, para que as entradas anteriores sejam mantidas.
Assim, na prática, quando PATH
é definido 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 o configuram, exceto o primeiro, geralmente fazem referência à PATH
própria variável, fazendo com que seu valor antigo seja incluído no novo.
Portanto, você está efetivamente solicitando a ordem na qual as PATH
configurações em vários arquivos entram em vigor.
Os locais comuns e de uso geral a PATH
serem definidos estão listados abaixo na ordem em que entram em vigor quando um usuário efetua login, não na ordem em que você normalmente deve considerá-los . Cada um dos locais listados abaixo é uma escolha razoável para a configuração PATH
em algumas situações , mas apenas alguns são boas escolhas na maioria das vezes.
Na lista abaixo, você verá alguns nomes de diretório como ~/.profile
. Caso você não esteja familiarizado com a expansão de til , ~/
consulte o diretório inicial do usuário atual. Eu uso principalmente essa sintaxe para compactar. É suportado em scripts de shell, mas não nos arquivos de configuração do PAM.
/etc/environment
O PAM no Ubuntu faz com que as variáveis de ambiente listadas /etc/environment
sejam definidas, se esse arquivo existir, o que, por padrão, existe. É 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ê deve definir variáveis de ambiente para todas as contas de usuário, em vez de apenas sua conta de usuário, modificar esse arquivo provavelmente é 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 .orig
extensão não é especificamente necessária - você pode se sentir bem em nomear o arquivo de backup de qualquer coisa que não seja confusa ou já esteja sendo usada. (Além de .orig
, .old
, .backup
e .bak
são comuns.)
Você pode editar esse arquivo em qualquer das maneiras que você pode editar qualquer outro arquivo como o usuário root ( sudoedit /etc/enviromnment
, sudo nano -w /etc/environment
, gksudo gedit /etc/environment
, etc.)
/etc/environment
não suporta a inclusão automática do valor antigo de uma variável. Mas isso geralmente não é necessário, pois na maioria das vezes você definiria 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 efetuar login, de qualquer maneira. O usuário pode alterá-lo como quiser. Normalmente, é bom que os usuários possam fazer isso.
/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 nos ~/.pam_environment
arquivos por usuário (veja abaixo).
Quando a mesma variável de ambiente é configurada em ambos /etc/environment
e /etc/security/pam_env.conf
, o valor in pam_env.conf
é usado - mesmo que esse valor seja especificado como DEFAULT
e não OVERRIDE
.
No entanto, quando você substitui uma linha environment
por uma pam_env.conf
, pode incluir o conteúdo do valor substituído. Consulte a seção abaixo .pam_environment
para obter detalhes (pois usa a mesma sintaxe).
Geralmente, não é necessário editar pam_env.conf
e você deve ter muito cuidado, se o fizer , pois uma linha malformada geralmente impedirá o logon de todas as contas de usuário normais! 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
Isso é apresentado como um dos vários exemplos. Uma das coisas que ilustra é como dividir uma tarefa em várias linhas \
. 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 impediu que todos os usuários fizessem login com êxito. Para corrigi-lo, 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, para que não me causasse nenhum problema.)
.pam_environment
no diretório inicial do usuárioUma das maneiras de definir uma variável de ambiente para um único usuário é editar (ou criar) .pam_environment
em seu diretório inicial. Os valores definidos neste arquivo substituem os definidos no /etc/environment
arquivo global .
.pam_environment
não faz parte do esqueleto dos arquivos que são copiados na pasta inicial do usuário quando a conta do usuário é criada inicialmente. No entanto, se você criar esse arquivo em seu diretório pessoal, poderá usá-lo para definir variáveis de ambiente como PATH
. Diferente /etc/environment
(mas semelhante /etc/security/pam_env.conf
), os .pam_environment
arquivos por usuário suportam a expansão do valor antigo de uma variável de ambiente para uma nova. No entanto, eles não são scripts de shell, e você deve usar uma sintaxe especial para conseguir isso, o que difere um pouco da sintaxe que você usaria em um arquivo como .profile
.
Por exemplo, se você tiver um bin2
diretório em seu diretório pessoal que deseja adicionar ao final PATH
, poderá fazer isso adicionando esta linha a .pam_environment
:
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2
Veja a ~/.pam_environment
subseção de EnvironmentVariables (a partir da qual o exemplo acima está bem adaptado) man pam_env
e man pam_env.conf
para mais detalhes.
Embora essa tenha sido apontada como a maneira preferida pelos usuários do Ubuntu de alterar ou adicionar variáveis de ambiente e ainda ser considerada uma opção razoável e aceitável, você deve ter cuidado ao editar.pam_environment
. Como as edições em todo o sistema /etc/security/pam_env.conf
(veja acima), uma linha malformada no .pam_environment
arquivo do usuário impedirá que os logins sejam bem-sucedidos. (Eu testei isso -. De propósito desta vez) Para obter informações sobre como as recomendações têm evoluído , veja Gunnar Hjalmarsson de comentários abaixo e esta ubuntu-devel
discussão .
Esse erro é muito menos sério, em geral , do que uma linha malformada pam_env.conf
, porque afeta apenas um usuário. No entanto, no caso de um sistema Ubuntu de desktop com apenas uma conta de usuário que permita logins, um erro durante a edição .pam_environment
será tão ruim quanto a edição pam_env.conf
- se você ainda não estiver logado, não poderá 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 não seja administrador e não possa sudo
fazer root, ele ainda poderá ser executado e solicitado a digitar sua senha (não a deles) A conta de convidado , no entanto, não pode fazer isso, pois é proibido usar para assumir a identidade de outro usuário.)su your-account
su
/etc/profile
e arquivos dentro/etc/profile.d/
Os shells compatíveis com Bourne (incluindo bash
o shell do usuário padrão no Ubuntu) executam os comandos /etc/profile
quando chamados como um shell de logon.
O Ubuntu /etc/profile.d
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 termine também .sh
sejam executados.
A maioria dos gerenciadores de exibição faz com que os comandos /etc/profile
(e, portanto, os arquivos entrem /etc/profile.d
) sejam executados também 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 em todo o sistema /etc/profile
, mas isso geralmente não é mais a melhor escolha. Se você não pode definir uma variável de ambiente /etc/environment
e deve defini-la para todos os usuários, provavelmente é melhor criar um novo arquivo do /etc/profile.d/
que editar- /etc/profile
se. 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, precedendo esse arquivo de configuração atualizado específico, ou você será solicitado a lidar com a situação.
Quando a mesma variável de ambiente é configurada em /etc/profile
um e mais arquivos /etc/profile.d
, qual é a última realizada? Isso depende se os comandos /etc/profile
nesse conjunto são exibidos antes ou depois da origem dos arquivos profile.d
(pelo código que citei acima). Os comandos /etc/profile
são executados na ordem em que aparecem.
/etc/profile
é um script de shell e sua sintaxe não é a mesma dos arquivos de configuração do PAM discutidos acima . Sua sintaxe é a mesma que a do ~/.profile
arquivo por usuário (veja abaixo).
Se você precisar escrever um código que decida se deseja ou não adicionar um diretório específico PATH
(e fazer isso para todos os usuários), 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/
substituir.
.bash_profile
no diretório inicial do usuárioSe um usuário tiver ~/.bash_profile
, o bash o usa em vez de ~/.profile
ou ~/.bash_login
(veja abaixo). Normalmente, você não deve ter um .bash_profile
em seu diretório pessoal.
Se você o fizer, geralmente deve conter um comando para a origem ~/.profile
(por exemplo, . "$HOME/.profile"
). Caso contrário, o conteúdo do .profile
arquivo por usuário não será executado.
.bash_login
no diretório inicial do usuárioSe um usuário tiver ~/.bash_login
, o bash o usa em vez de ~/.profile
(veja abaixo), a menos que ~/.bash_profile
exista, nesse caso nenhum dos outros será usado, a menos que seja proveniente de `~ / .bash_login.
Assim como em geral .bash_profile
, você não deve ter um .bash_login
arquivo no diretório inicial.
.profile
no diretório inicial do usuário.Quando um shell no estilo Bourne é executado como um shell de login, ele executa os comandos /etc/profile
(o 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 no .profile
diretório inicial do usuário. Este arquivo é separado para cada usuário. (Bash realmente funciona .bash_profile
ou .bash_login
ao invés, se existirem -., Mas, para os usuários em um sistema Ubuntu, esses arquivos raramente deve ou não existem Para detalhes, ver acima e 6,2 Bash arquivos de inicialização no manual 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 o seu PATH
, mas como o Ubuntu possui o módulo pam_env e suporta ~/.pam_environment
, você deve considerar usá-lo.
Assim como /etc/profile
nem todos os gerenciadores de exibição executam esse arquivo para logins gráficos, embora a maioria faça. Esta é uma razão para preferir ~/.pam_environment
para definir variáveis de ambiente (tanto quanto se pode preferir /etc/environment
a /etc/profile
).
Você pode expandir variáveis de ambiente, incluindo PATH
-se, quando você define PATH
na .pam_environment
(veja acima). No entanto, se você precisar configurá-lo PATH
de uma maneira mais sofisticada, talvez seja necessário usá-lo .profile
. Em particular, se você quiser verificar se existe um diretório sempre que um usuário efetuar login e adicioná-lo somente se PATH
existir, não poderá usar seu .pam_environment
arquivo para adicioná-lo ao seu PATH
.
Por exemplo, o .profile
arquivo por usuário padrão no Ubuntu costumava terminar 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 sobre a resposta de Byte Commander para mais detalhes.
Isso verifica se você possui um bin
subdiretório do diretório inicial. Nesse caso, ele adiciona esse subdiretório ao início do seu PATH
.
Existem outras maneiras pelas quais as 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 definidas apenas para logins gráficos ou apenas para logons remotos baseados em SSH. A lista acima não cobre esses casos.
Eu deixei de fora alguns arquivos nos quais as pessoas às vezes definem variáveis de ambiente, como ~/.bashrc
e /etc/bash.bashrc
, porque geralmente não são locais recomendados para configurar PATH
e é raro que você realmente os use para esse fim. Se você usar esses arquivos para adicionar diretórios PATH
, eles às vezes serão adicionados muitas vezes e ficarão muito confusos quando você examinar $PATH
. (Em casos extremos, isso pode tornar as coisas mais lentas, mas geralmente é apenas uma questão de manter tudo limpo e compreensível.)
Como bash
é o shell de login padrão do Ubuntu para os usuários, e a maioria dos usuários o utiliza ou algum outro shell compatível com POSIX, omiti informações sobre como as variáveis de ambiente são definidas em outros shells não-Bourne, como o tcsh
.
/etc/environment
/ ~/.pam_environment
como os arquivos recomendados. Depois de ter consultado os desenvolvedores , mudei para neutro entre PAM e /etc/profile.d/*.sh
/ ~/.profile
, e continuo a olhar dessa maneira.
/etc/profile.d/*.sh
/ ~/.profile
são que a sintaxe é mais simples e que o lightdm / gdm perdoa em caso de erros (nem mesmo os erros de sintaxe impedem o login, mas resultam em mensagens de aviso).
pam_env.so
, você quis dizer pam_env.conf
?
pam_env.conf
. Obrigado! Eu editei para corrigi-lo.
O arquivo / etc / environment não é um arquivo de script que não pode ser exportado para lá e não suporta expansão variável do tipo $ HOME, apenas pares simplevariable = value. Portanto, para usar esse arquivo, é necessário simplesmente anexar o caminho à definição existente, especificamente para configurações de variáveis de ambiente em todo o sistema. Um por linha. Especificamente, esse arquivo armazena as configurações de local e de caminho em todo o sistema.
~ / .profile - Este arquivo é executado sempre que um shell bash é executado, geralmente é o recomendado para variáveis de ambiente, no entanto, tem a desvantagem de ser invocado apenas por shells de login, portanto, para que ele entre em vigor, você precisará para sair e entrar novamente - ou pelo menos, inicie um novo shell de login.
O local preferido para definir variáveis ambientais depende de várias coisas:
/etc/environment
já que não há perigo de acesso não autorizado./etc/environment
, mas~/.profile
para cada usuário do sistema, uma vez que está localizado no diretório inicial de cada usuário.O sistema irá ler /etc/environment
antes de ler ~/.profile
. Nenhuma concatenação ocorre e, como Alex P disse, a última atribuição ao caminho prevalece.
Para uma análise mais detalhada dos fatores que determinam como ~/.profile
e se /etc/environment
desenrola com outros locais, vá aqui e aqui , pois esses fatores influenciarão a maneira como você usa esses locais.