Estou tendo problemas para entender o que pertence ~/.profile
e o que pertence ao ~/.bashrc
.
Pelo que li, parece -me que ~/.profile
deve ser usado para variáveis de ambiente e ~/.bashrc
para aliases, funções e afins. Se eu mover todas as minhas export
instruções de ~/.bashrc
para ~/.profile
, tudo funcionará como deveria ou estou prestes a quebrar alguma coisa?
(Aqui está meu repositório dotfiles se você quiser examinar os dois arquivos.)
EDIT 2022-06-03: Mudei a maioria das minhas variáveis de ambiente de ~/.bashrc
para ~/.profile
e me assegurei de que ~/.bash_profile
sources ~/.profile
. As únicas variáveis de ambiente que deixei ~/.bashrc
são aquelas que só importam quando estou trabalhando em um shell, por exemplo, aquelas pertencentes a menos, os prompts, slrn e similares. Tudo parece estar funcionando bem. Obrigado pela ajuda.
Isso ajuda a entender quais arquivos são originados quando e por quê .
.profile
é originado por um shell de login na inicialização. Normalmente, o único shell de login que você inicia é aquele iniciado quando você faz login, mas você pode executar um shell de login a qualquer momento combash -l
. (Além disso, no macOS, não há shell de login inicial, então os emuladores de terminal tendem a executar um shell de login para cada nova janela.).profile
é um local ideal para definir variáveis de ambiente que podem ser herdadas por qualquer programa iniciado a partir do shell de login..bashrc
, por outro lado, é originado por shells interativos sem login, como aqueles iniciados por janelas de terminal. É aqui que você define as coisas específicas do seu shell interativo que não são herdadas do processo pai. Por exemplo,PS1
é definido aqui porque apenas shells interativos se preocupam com seu valor, e qualquer shell interativo será fonte.bashrc
de qualquer maneira, portanto, não há necessidade de definir e exportarPS1
de.profile
.E embora você não tenha perguntado, vale a pena apontar a diferença entre
.profile
e.bash_profile
aqui..profile
é "compartilhado" por todos os shells POSIX (comodash
), portanto, não coloque nadabash
específico aqui..bash_profile
, no entanto, é usado apenas porbash
, portanto, você pode usarbash
extensões nele. Se.bash_profile
estiver presente,.profile
será ignorado, portanto, se por qualquer motivo você quiser usar os dois, poderá adicionar. ~/.profile
ao topo do seu arquivo.bash_profile
.~/.profile
é chamado apenas quando você faz login pela primeira vez em sua conta. Quaisquer alterações que você fizer depois disso, seria aconselhável sair e voltar para que as configurações tenham efeito.~/.bashrc
é chamado toda vez que você inicia uma janela de terminal. Existe outroprofile
arquivo e está no/etc/
diretório. A principal diferença entre os dois é que o/etc/profile
é chamado quando alguém faz login no sistema e o~/.profile
é chamado quando apenas o usuário faz login.Se suas
export
linhas forem usadas apenas em uma sessão de terminal, eu as adicionaria ao~/.bashrc
arquivo, pois elas são válidas apenas durante a sessão do terminal (bash). Mas, se você quiser que eles estejam lá com ou sem um terminal aberto, adicione-os ao~/.profile
arquivo, mas, como @chepner afirmou, não coloque comandos específicos do bash no~/.profile
arquivo.Se você estragar esses arquivos, existem arquivos padrão armazenados no
/etc/skel/
diretório que você pode copiar de volta para o seu diretório pessoal. Além disso, os/etc/skel/
arquivos também são usados quando você inicializa em um LiveUSB/CD/DVD, portanto, se você modificá-los em sua mídia ao vivo e, quando concluir a inicialização, poderá ter suas próprias variáveis definidas.a resposta de chepner cobre os princípios gerais. Existem algumas outras sutilezas que você deseja observar.
Primeiro, os shells de login não originam ,
.bashrc
mesmo que sejam interativos. Assim, você provavelmente quer um.bash_profile
que contenha código como o seguinte:Isso não fará muita diferença em um login de console em um ambiente gráfico, mas fará muita diferença em um console de texto ou login ssh.
Você não precisa necessariamente fazer o teste interativo; Eu realmente fonte
.bashrc
mesmo para shells não interativos (embora isso não seja uma boa ideia em algumas circunstâncias).Observe que, se você também usar shells não Bash, também precisará de um
.profile
com quaisquer variáveis de ambiente etc. que desejar para eles. O Bash irá ignorar o seu.profile
quando você tiver um.bash_profile
, mas é claro que o último pode fornecer o primeiro.Nem todo login novo (ou seja, um shell criado não por seu id de usuário, mas por um processo root que o autenticou) é considerado um "shell de login". Em particular, dar um comando para uma invocação ssh (
ssh somehost.example.com 'echo $-'
) não será um "shell de login" e.bash_profile
/.bash_login
/.profile
não será originado. Aqui está uma tabela mostrando o que é considerado um "login" ou shell interativo e o que é executado para várias invocaçõesargv[0][0] == '-'
,--login
-i
, stdin é tty/etc/profile
então primeiro de~/.bash_profile
,~/.bash_login
,~/.profile
/etc/bash.bashrc
então~/.bashrc
ssh host.com
(sshd define argv[0]="-bash")ssh host.com </dev/null
(sshd define argv[0]="-bash")bash -i
,bash
em ttybash hello.sh
,bash -c echo foo
,ssh host.com 'echo $-'
(ssh é executadobash -c 'echo $-
)A tabela vem deste documento ; há algumas informações adicionais lá que também podem ser úteis. (Qualquer pessoa que sinta que algo deve haver nesta resposta deve se sentir à vontade para editá-la e copiá-la.)