Visualização completa de onde a variável PATH está definida no bash

8

Eu li em alguns lugares que o PATH está definido em / etc / profile ou no arquivo .profile que está no diretório home.

Esses são os únicos lugares em que o caminho está definido? Eu quero uma melhor compreensão disso.

No arquivo / etc / profile, ele diz "arquivo .profile do sistema para o shell Bourne" no comentário. Isso significa que os arquivos de perfil são os principais arquivos de configuração do bash?

Nesse arquivo, não vejo a variável PATH sendo definida. No arquivo .profile no diretório inicial, há essa linha:

PATH="$HOME/bin:$PATH"

Isso está redefinindo o PATH pela aparência porque está concatenando a string $ PATH já definida com $ HOME / bin: certo? Mas se etc / profile e ~ / .profile são os únicos arquivos que definem PATH, onde está $ PATH vindo daquela linha de código se não estiver definido em / etc / profile?

Alguém experiente pode dar uma explicação ampla e detalhada da variável PATH? Obrigado!

    
por Larry Lawless 07.09.2015 / 10:04

3 respostas

12

Existem muitos lugares onde PATH pode ser definido.

O programa login define como um valor padrão. Como esse valor padrão é configurado depende do sistema. Na maioria dos sistemas Linux não embarcados, ele é obtido de /etc/login.defs , com valores diferentes para raiz e para outros usuários. Consulte o manual login(1) em seu sistema para descobrir o que ele faz.

Em sistemas que usam PAM , especificamente o pam_env módulo, variáveis de ambiente podem ser definidas no arquivo de todo o sistema /etc/environment e o arquivo por usuário ~/.pam_environment .

Em seguida, a maioria das maneiras de efetuar login (mas não de tarefas agendadas) executam uma shell de login que lê arquivos de configuração de todo o sistema e por usuário. Esses arquivos podem modificar o valor de PATH , geralmente para adicionar entradas, mas às vezes de outras maneiras. Quais arquivos são lidos dependem do que é o shell de login. Cascas Bourne / estilo POSIX leem /etc/profile e ~/.profile . Bash lê /etc/profile , mas para o arquivo por usuário, ele lê somente o primeiro arquivo existente entre ~/.bash_profile , ~/.bash_login e ~/.profile . Zsh lê /etc/zshenv , ~/.zshenv , /etc/zprofile , ~/.zprofile , /etc/zlogin e ~/.zlogin . Muitas sessões da GUI organizam para carregar /etc/profile e ~/.profile , mas isso depende do gerenciador de exibição, do ambiente da área de trabalho ou de outro script de inicialização da sessão e de como cada distribuição configurou isso.

    
por 08.09.2015 / 02:50
4

A variável PATH inicial geralmente é definida em /etc/profile Às vezes, um administrador do sistema também coloca as variáveis PATH na origem em /etc/profile.d

Estas são as varas PATH do sistema que todos os que fazem login herdam por padrão (a menos que sejam substituídas localmente). Isso geralmente define caminhos óbvios, como /usr/bin , embora no meu trabalho usemos /opt e alguns locais personalizados extensivamente, então eles são definidos lá também.

Em uma conta de login por usuário, o PATH também pode ser definido em ~/.profile . Isso pode definir coisas que nem todos os usuários têm acesso; talvez chefes de departamento possam executar binários a partir de /opt , mas outros usuários não estão incomodados com esses binários. Os usuários também podem modificar esse arquivo, e o bom sobre .profile é que ele não é específico do shell; se você fizer o login, o conjunto PATH lá será originado.

Para logins específicos do shell, o PATH pode ser definido em ~/.bash_profile , ~/.bashrc ou .cshrc ou similar. Os usuários podem definir o PATH aqui se quiserem caminhos específicos para shells específicos ou se, por acaso, eles mantiverem todas as suas preferências pessoais.

Em resumo: / etc / profile e /etc/profile.d são configurações tradicionalmente em cascata; eles são herdados e geralmente são adicionados em arquivos de ponto pessoais (embora um usuário possa optar por substituí-los). Os arquivos de pontos pessoais geralmente são definidos por um usuário.

Naturalmente, um shell também possui variáveis de ambiente, portanto, uma variável de ambiente local também pode adicionar ou substituir o PATH padrão em qualquer um dos arquivos de configuração.

    
por 07.09.2015 / 10:27
1

Para adicionar as outras respostas:

bash definirá PATH como um valor padrão codificado se não estiver definido no ambiente. Em uma máquina Ubuntu Server 16.04.2, recebo:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Podemos verificar se esse valor é realmente codificado e não lido no ambiente ou em algum arquivo, usando o utilitário strings :

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

No entanto, obtenho um resultado diferente na minha máquina Arch Linux:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Portanto, parece que esse padrão é escolhido no momento em que o binário bash foi construído, o que depende do sistema operacional / distribuição em uso.

    
por 18.10.2018 / 07:16