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


16

Eu li em alguns lugares em que o arquivo PATHestá definido /etc/profileou o .profilearquivo 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 /etc/profilearquivo, como o seguinte comentário diz "system-wide .profile file for the Bourne shell". Isso significa que os arquivos de perfil são os principais arquivos de configuração do bash?

Nesse arquivo, não vejo o PATHvar sendo definido. No .profilearquivo no diretório inicial, há esta linha:

PATH="$HOME/bin:$PATH"

Isso é redefinido PATHpela aparência, porque está concatenando a $PATHstring já definida com $HOME/bin:certo? Mas se etc/profilee ~/.profileos únicos arquivos PATHque estão definindo $PATHa origem dessa linha de código, se ela não estiver definida /etc/profile?

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

Respostas:


19

Existem muitos lugares onde PATHpode ser definido.

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

Nos sistemas que usam o PAM , especificamente o pam_envmódulo, as variáveis ​​de ambiente podem ser definidas no arquivo de todo o sistema e no arquivo /etc/environmentpor usuário ~/.pam_environment.

Em seguida, a maioria das maneiras de efetuar login (mas não as tarefas cron) executa um shell de logon que lê arquivos de configuração em 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. As conchas no estilo Bourne / POSIX leem /etc/profilee ~/.profile. O Bash lê /etc/profile, mas para o arquivo por usuário, ele lê apenas o primeiro arquivo existente entre ~/.bash_profile, ~/.bash_logine ~/.profile. Zsh lê /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zlogine ~/.zlogin. Muitas sessões da GUI planejam carregar /etc/profilee ~/.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 os configurou.


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 fonte/etc/profile.d

Estes são os Vars PATH do sistema que todos que efetuam login herdam por padrão (a menos que sejam substituídos localmente). Isso geralmente define caminhos óbvios, como /usr/bin, embora, no meu trabalho, utilizemos /optextensivamente alguns locais personalizados, portanto esses também são definidos lá.

Em contas de login por usuário, PATH também pode ser definido em ~/.profile. Isso pode definir coisas às quais nem todos os usuários têm acesso; talvez os chefes de departamento possam executar binários, /optmas outros usuários não se incomodam com esses binários. Os usuários também podem modificar esse arquivo, e o interessante .profileé que ele não é específico do shell; se você fizer o login, o conjunto de PATH será obtido.

Para logins específicos de concha, PATH pode ser definido em ~/.bash_profile, ~/.bashrcou .cshrc, ou semelhante. Os usuários podem definir PATH aqui se quiserem caminhos específicos para shells específicos ou se mantiverem todas as suas preferências pessoais lá.

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

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


Acabei de verificar todos os arquivos que você mencionou, ~ / .bash_profile e .cshrc, mas não existem. Os 3 arquivos de script no diretório /etc/profile.d: appmenu-qt5.sh, bash_completion.sh & vte.sh também não configuram a variável PATH. O que você quer dizer com "um shell também possui variáveis ​​de ambiente" é o PATH padrão definido no programa binary / bin / bash? Quando eu terminal echo $ PATH recebo: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games mas eu não tenho uma ideia de onde tudo está sendo realmente definido.
Larry Lawless

Acho que interpretei um pouco errado sua pergunta, pensei que você estava pedindo todos os locais em que PATH poderia ser definido, mas acho que você está mais interessado em saber onde PATH está definido inicialmente . Para isso, olhe /etc/bashrc. Isso determina como o BASH é iniciado, o que deve incluir todas as variáveis ​​de ambiente iniciais. No meu sistema, /etc/bashrclê a partir de, /etc/profile.dmas parece que você tem apenas 3 arquivos, /etc/profile.dportanto sua distribuição pode estar fazendo de maneira diferente.
Klaatu von Schlacker

1
Basicamente, quero saber os meandros disso. Desejo Ken Thompson era meu pai :)
Larry Lawless

Você chegará lá. Acredite, depois de usar essas coisas diariamente por um tempo, tudo começa a afundar, e enquanto você fica perguntando "por quê?" e lendo documentos para as respostas, você acaba aprendendo muito!
Klaatu von Schlacker

No Linux Mint 18 Cinnamon, verifique o /etc/profile.d/jdk_home.sh. Renomeei esse arquivo para jdk_home.sh.old e agora meu caminho não é substituído e posso chamar a versão-java e ver o Java 9 como esperado. Mesmo que eu selecionado corretamente Java 9 em update-aternatives --config java esse arquivo jdk_home.sh mantido substituindo o $ PATH
flyingdrifter

3

Para adicionar às outras respostas:

bashserá definido PATHcomo 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 stringsutilitário:

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

No entanto, recebo 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 bashbinário foi construído, o que depende do sistema operacional / distribuição em uso.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.