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

25

Onde é o local preferido para definir o PATH envvar?

~/.profile ou /etc/environment ?

Qual é o caso quando PATH é definido em ambos os locais? O resultado final é uma concatenação de ambos os valores definidos nesses dois locais?

    
por pkaramol 30.12.2016 / 14:45

4 respostas

34

Resumo:

  • Se você quiser adicionar um caminho (por exemplo, /your/additional/path ) à sua variável PATH apenas para seu usuário atual e não para todos os usuários de seu computador, normalmente você o colocará no final de ~/.profile como em 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 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 ​​dos 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 em /etc/environment , mas criar um arquivo com o nome do arquivo que termina em .sh in /etc/profile.d/ . O script /etc/profile e todos os scripts em /etc/profile.d são o equivalente global 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. Ele é de propriedade de root , portanto, você precisa ser um usuário administrador e usar sudo para modificá-lo.

  • ~/.profile é um dos scripts de inicialização de shell pessoal do usuário. Cada 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 para cada usuário. Os scripts globais são executados antes dos scripts específicos do usuário; e o principal /etc/profile executa todos os scripts *.sh em /etc/profile.d/ antes de sair.

  • O arquivo /etc/environment normalmente contém apenas esta linha:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    

    Define a variável PATH para todos os usuários no sistema para esse valor padrão, que não deve ser alterado de forma significativa. Pelo menos você não deve remover nenhum dos caminhos importantes como /bin , /sbin , /usr/bin e /usr/sbin dele.

    Este arquivo é lido como um dos primeiros arquivos de configuração por cada shell de cada usuário. Note 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 arquivo ~/.profile pode conter muitas coisas, por padrão ele contém entre outras coisas uma verificação se existe um diretório ~/bin e adiciona isso à variável PATH existente do usuário, como esta (em versões mais antigas do Ubuntu anteriores à 16.04 - lançamentos mais recentes adicionam-no incondicionalmente):

    # 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 manualmente novos caminhos, você também deve sempre manter o antigo valor $PATH em algum lugar na nova string.

    Este 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 padrão do Bash, certifique-se de não ter um ~/.bash_profile ou ~/.bash_login se quiser que as alterações em ~/.profile tenham efeito para o usuário.

Para um entendimento completo sobre Variáveis ​​de Ambiente, consulte: Ссылка

Pergunta relacionada: diferença entre o bash.bashrc e o arquivo / etc / environment

    
por Byte Commander 30.12.2016 / 15:10
14
  

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 .

    
por Eliah Kagan 30.12.2016 / 19:30
2
O arquivo

/ etc / environment não é um arquivo de script que você não pode exportar e não suporta expansão variável do tipo $ HOME, apenas pares simplevariable = value. Portanto, para usar esse arquivo, basta anexar seu 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 caminho do sistema.

~ / .profile - Este arquivo é executado sempre que um shell bash é executado, geralmente é o recomendado para variáveis ​​de ambiente, no entanto, ele tem a desvantagem de ser invocado apenas por shells de login. Para fazer com que ele tenha efeito, você precisará sair e voltar - ou, pelo menos, iniciar um novo shell de login.

    
por eGhoul 30.12.2016 / 15:07
1

O local preferido para definir variáveis ​​ambientais depende de várias coisas:

  1. Você é o único usando o computador:
    • Nesse caso, o melhor lugar para defini-lo seria em /etc/environment , pois não há perigo de acesso não autorizado.
  2. Se o sistema for usado por muitos
    • Se as variáveis ​​ devem ser acessadas por todos, o local seria /etc/environment , mas
    • se usuários individuais tiverem selecionado o acesso a eles, cada um deverá definir os deles no ~/.profile pertencente a cada usuário do sistema, pois ele está localizado na página inicial de cada usuário diretório.

O sistema lerá /etc/environment antes de ler ~/.profile . Nenhuma concatenação ocorre e como Alex P disse que a última atribuição ao caminho prevalece.

Para uma análise mais detalhada dos fatores que determinam como ~/.profile e /etc/environment são reproduzidos em outros locais, vá para aqui e aqui , pois esses fatores influenciarão o uso desses locais.

    
por George Udosen 30.12.2016 / 15:10