Por que .profile (e não .bashrc) anexa ~ / bin ao caminho?

9

Como .bashrcé mais "genérico" (no sentido em que o .profileorigina), por ~/binque o procedimento "incluir no caminho" não está dentro .bashrc? Por que o usuário não o deseja em um shell que não é de login? (Especialmente hoje em dia, onde shells sem login são mais comuns *.)

Sei que posso fazer essas alterações manualmente, mas quero saber se existe um motivo.

* Não posso provar, mas acho que é esse o caso.

Borges
fonte

Respostas:

13

~/.bashrce /etc/bash.bashrcsão executados toda vez que um bashshell interativo é iniciado.

Por outro lado, ~/.profilee /etc/profilesão executados toda vez que qualquer shell de login é iniciado. Portanto, ele não precisa ser um bashshell, mas precisa ser um shell de login (e muitas bashinstâncias do shell não são shells de login ).

  • Um bashshell é um shell em que o programa que o fornece bash, em vez de algum outro programa, como o dash.
  • Um shell de logon é um shell que é iniciado automaticamente como conseqüência do logon, para fornecer a interface do usuário (gráfica ou de linha de comando) para o logon. Quando um shell de login é encerrado, o login termina.

Portanto, colocar um elogio que acrescenta entradas PATHem um bashrcarquivo:

  1. Não faça nada quando o shell não estiver bash, o que geralmente acontece. Por exemplo, PATHnão seria modificado quando você estiver em uma sessão gráfica de login. Lembre-se, PATHnão é usado apenas por programas de linha de comando.

  2. Acrescente-o repetidamente na presença de bashconchas aninhadas . Portanto, se você iniciar um shell dentro de um shell - o que é muito comum, por várias razões -, você terá várias ~/binentradas empilhadas no seu PATH. Isso PATHdificulta a leitura da variável de ambiente e, às vezes, também diminui o desempenho.

Isso seria indesejável. Portanto, seria errado colocar isso em um bashrcarquivo; realmente pertence ~/.profile. ~/.profileé o lugar certo para:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Os shells que não fazem login têm shells de login (ou algo que se comporta como um shell de login) como pai e herdam a maioria de suas variáveis ​​de ambiente, inclusive PATH, desse shell de login. Portanto, a inserção de comandos de modificação de caminho ~/.profileexige que você efetue logout e logon novamente para que eles sejam efetivos, mas isso também afeta o ambiente de shells que não são de login (assim como o ambiente de programas que não são shells, pois cada programa obtém seu próprio conjunto de variáveis ​​de ambiente - chamado de "ambiente" - herdado de seu processo pai).

Eliah Kagan
fonte
Compreendo. Mas essa decisão ainda não faz sentido para mim. Se um terminal aberto for aberto no momento, ele carregará apenas .bashrc, então não poderei ver minha caixa particular.
borges
@borges Se a configuração padrão não funcionar bem para você, sinta-se à vontade para alterá-la. (Afinal, é o seu computador. Ou pelo menos a sua conta.) Mas isso parece uma coisa única. Ou seja, parece que seu bindiretório privado não existia quando você fez logon e que você o criou durante esta sessão de login. Se você sair e entrar novamente, ele estará no seu PATH. Como criar seu bindiretório privado é algo que só precisa ser feito uma vez, isso é um inconveniente único.
Elias Kagan
3

É porque tradicionalmente as variáveis ​​de ambiente entram apenas em /etc/profileou .profile. O bashrcarquivo é para coisas como aliases, configurações de prompt, opções de shell e assim por diante (ou seja, coisas que se relacionam diretamente com o shell).

teppic
fonte