Configurando a variável PATH em /etc/environment vs .profile

Configurando a variável PATH em /etc/environment vs .profile

Onde é o local preferido para definir o PATHenvvar?

~/.profileou /etc/environment?

Qual é o caso quando PATHestá 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) à sua PATHvariável apenas para o usuário atual e não para todos os usuários do seu computador, normalmente você o coloca no final, ~/.profilecomo 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/environmentmas criar um arquivo com o nome do arquivo terminando .shem /etc/profile.d/. O /etc/profilescript e todos os scripts nele contidos /etc/profile.dsão o equivalente global do pessoal de cada usuário ~/.profilee 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 de root, então você precisa ser um usuário administrador e usá-lo sudopara 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/profilee /etc/profile.d/*.shsão os scripts de inicialização globais equivalentes ~/.profilepara cada usuário. Os scripts globais são executados antes dos scripts específicos do usuário; e o main /etc/profileexecuta todos os *.shscripts /etc/profile.d/antes de sair.


  • O /etc/environmentarquivo 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 PATHvariá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 , /bine 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 ~/.profilearquivo pode conter muitas coisas, por padrão ele contém, entre outras coisas, uma verificação se um ~/bindiretório existe e adiciona isso à PATHvariá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 $PATHvalor 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_profileou ~/.bash_loginse deseja que as alterações ~/.profiletenham 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 PATHsã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ções PATHe 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 PATHdependequais 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 PATHvariável de ambiente terá o valor que tinhaatribuído mais recentemente. Na prática,maioriado tempo que você definiu PATH, você inclui ovelhovalor de PATHno 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 PATHprópria variável, fazendo com que seu valor antigo seja incluído no novo.

Portanto, você está solicitando a ordem em que PATHas configurações em vários arquivos entram em vigor.

Os locais comuns e de uso geral a serem definidos PATHestã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/environmentsejam 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 .origextensã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, .backupe .baksã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/environmentnã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_environmentarquivos por usuário (veja abaixo).

Quando a mesma variável de ambiente é definida em /etc/environmente /etc/security/pam_env.conf, o valor in pam_env.confé usado - mesmo que esse valor seja especificado como DEFAULTem vez de OVERRIDE.

No entanto, ao substituir uma linha in environmentpor uma in pam_env.conf, você pode incluir o conteúdo do valor substituído. Consulte a seção abaixo .pam_environmentpara obter detalhes (já que usa a mesma sintaxe).

Geralmente não é necessário editar pam_env.confevocê 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.confconté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_environmentno 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_environmentem seu diretório inicial. Os valores definidos neste arquivo substituem aqueles definidos no /etc/environmentarquivo global.

.pam_environmentnã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_environmentsuportam 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 bin2diretó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_environmentsubseçãodeVariáveis ​​ambientais(do qual o exemplo acima foi adaptado),man pam_env, eman pam_env.confpara 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_environmentimpedirá 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-develdiscussã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_environmentserá 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 sudofazer root, eles ainda poderão executar e ser solicitados a inserir sua senha (não a deles). . Osu your-accountconvidadoconta, no entanto, não pode fazer isso, pois é proibido usá-la supara assumir a identidade de outro usuário.)

4. Para todos os usuários: /etc/profilee arquivos dentro/etc/profile.d/

Shells compatíveis com Bourne (incluindo basho shell de usuário padrão no Ubuntu) executam os comandos /etc/profilequando invocados como um shell de login.

O Ubuntu /etc/profiletermina 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 .shtambé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/environmente 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/profilearquivo 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/profilee em um ou mais arquivos /etc/profile.d, qual é executada por último?Isso depende se os comandos nesse /etc/profileconjunto aparecem antes ou depois dos arquivos profile.dterem sido originados (pelo código que citei acima). Os comandos in /etc/profilesã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 ~/.profilearquivo 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/environmentou /etc/security/pam_env.conffazer isso. Esta é talvez a principal situação em que é melhor usar /etc/profileou /etc/profile.d/em vez disso.

5. Para um usuário: .bash_profileno diretório inicial do usuário

Se um usuário tiver ~/.bash_profile, o bash o usará em vez de ~/.profileou ~/.bash_login(veja abaixo). Normalmente você não deve ter um .bash_profileem 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 .profilenão será executado.

6. Para um usuário: .bash_loginno 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_profileexista, 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_loginarquivo em seu diretório inicial.

7. Para um usuário: .profileno 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 .profileno diretório inicial do usuário. Este arquivo é separado para cada usuário. (O Bash realmente é executado .bash_profileou, .bash_loginem 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_environmentdefinir variáveis ​​de ambiente(por mais que se prefira /etc/environment) /etc/profile.

Você pode expandir as variáveis ​​de ambiente, incluindo PATHele mesmo, ao configurá-las PATH( .pam_environmentveja acima). No entanto, se você precisar configurar PATHde 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 PATHse existir, você não poderá usar seu .pam_environmentarquivo para adicionar esse diretório ao seu arquivo PATH.

Por exemplo, o arquivo padrão por usuário .profileno 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 binsubdiretó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 ~/.bashrce /etc/bash.bashrc, porque geralmente não são locais recomendados para definir PATHe é 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:

  1. No âmbito do sistema

    /etc/profile- Não é uma boa ideia editá-lo diretamente.
    /etc/profile.d/*.sh- fornecido por/etc/profile

  2. em toda a sessão

    ~/.profile

https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh

informação relacionada