Qual é a diferença entre .bash_profile e .bashrc?


245

Para criar um alias para o Terminal no OS X, você pode colocar os alias em .bash_profileou .bashrc. Qual é a diferença entre os dois e por que eu escolheria colocar aliases em um e não no outro?


5
Para não desencorajar o conhecimento unix aqui, o bash é um animal UNIX puro, para que você possa obter um melhor conhecimento ou ter essa pergunta respondida várias vezes em um site parceiro. Existem mais de 200 pares de perguntas / respostas
bashrc

Também existe .profile ... Veja esta pergunta no Stack Overflow.
Yaakov Baruch 03/02

2
Se você brew install bashe usar iTerm2, você pode definir profile -> commanda /usr/local/bin/bashque irá carregar .bashrcpor padrão depois .bash_profile. Isto também lhe dá Bash 4 guloseimas ...
Ray Foss

Ouvi dizer que .bashrc não é usado há anos e, por padrão, não funciona, e .bash_profile é o que há no macosx. E eu tentei .bashrc
et

Respostas:


247

.bash_profileé executado para shells de login, enquanto .bashrcé executado para shells interativos de não login.

Quando você faz login (digite nome de usuário e senha) no console, sentado na máquina ou remotamente via ssh: .bash_profileé executado para configurar seu shell antes do prompt de comando inicial.

Mas, se você já fez login na sua máquina e abre uma nova janela de terminal (xterm), .bashrcé executada antes do prompt de comando da janela. .bashrctambém é executado quando você inicia uma nova instância do bash digitando /bin/bashum terminal.

No OS X, o Terminal, por padrão, executa um shell de login todas as vezes, portanto isso é um pouco diferente da maioria dos outros sistemas, mas você pode configurá-lo nas preferências.


57
On OS X, Terminal by default runs a login shell every time- Eu sempre fiquei tão confusa por não perceber isso. Ótima informação!
Vaughan

1
@ Alex, Por que o terminal OS X executava um shell de login todas as vezes?
Pacerier

17
porque alguns desenvolvedores da Apple não perceberam a diferença originalmente e agora estão consagrados em alguns mumbo-jumbo.
Snowcrash

2
Estou no OS X e uso o zshell em vez do bash e o iTerm em vez do Terminal. Apesar de estar usando um terminal diferente e um shell diferente do que a resposta aborda, o OS X ainda parece considerar tudo um shell de logon, porque .zprofileé executado sempre.
Adam Zerner

1
Para aqueles que procuram uma explicação completa das combinações de shells de login / não login e interativos / não interativos e quando executam esses arquivos de configuração, consulte unix.stackexchange.com/a/46856/38715
kevinmicke

45

O X11 examinará seu .bashrctempo enquanto um terminal "regular" analisará.bash_profile

No entanto, se você adicionar o seguinte ao seu .bash_profile, então você pode mover tudo em seu .bashrcarquivo, de modo a consolidar tudo em um só lugar, em vez de dois:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi

Ou você poderia simplesmente fazer cd ~ ; ln -s .bashrc .bash_profile.
lhf 13/05/12

5
Esses 2 arquivos de configuração têm uma função claramente separada. Em alguns casos, é necessário ter coisas para inicializar no início da sessão e somente lá ( ~/.bash_profile). Também é frequentemente necessário ter coisas para definir incrementalmente em todos os níveis do shell ( ~/.bashrc). Não é a melhor idéia a sugerir suprimir essa liberdade.
dan

3
@danielAzuelos: O Lurch deixou essa parte de fora, mas o OS X Terminal fornece ~/.bash_profiletodas as novas janelas / guias, então não há realmente uma maneira de separar as duas no que diz respeito ao Terminal.
Mipadi

14
@mipadi Ainda há valor para separá-los. Por exemplo, .bash_profilenunca pode ser obtido novamente no processo filho. Cada nível de fontes de Bash aninhados .bashrc, por isso, se você colocar algo como export A=a:$Ano .bashrc, o seu $Avai ficar mais tempo no Bash aninhada. Normalmente deixo a variável de ambiente no perfil e os aliases no RC.
Franklin Yu

@FranklinYu Pode não ser um grande negócio para muitas pessoas, mas eu concordo totalmente! É um ótimo ponto técnico para lembrar as pessoas e merece muito mais votos.
Subfuzion

24

Para o macOS, o código a ser inserido .bash_profilepara consolidar tudo .bashrcé o seguinte:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Isso é mais específico para o usuário do terminal Mac.


6
Embora seja verdade, como isso difere da resposta de Lurch de 2012 ?
Arjan

0

TLDR; use .bash_profilepara seus apelidos.

A maneira como os diferentes arquivos de inicialização funcionam juntos é um pouco mais complicada e existem alguns casos especiais importantes no OSX. Aqui estão os destaques:

  • O Bash, em qualquer plataforma, executa um dos vários arquivos diferentes, dependendo de como é chamado. Os detalhes estão aqui .
  • O Terminal App da OSX faz algo fora do padrão: cria cada nova guia ou janela como se fosse um shell de login, o que significa que .bash_profileé chamado. Assim, o conselho TLDR acima.
  • .bashrctambém é uma opção, mas isso será chamado toda vez que você criar um subshell (por exemplo, invocar bash), que poderá criar ineficiência se você atualizar uma variável dentro dele (por exemplo, PATH=/bin/foo:$PATH)
  • Outros aplicativos que possuem terminais incorporados podem optar por seguir a convenção do Terminal App ou não. Notavelmente, o Código do Visual Studio, por padrão, não .
  • Aplicativos chamados por meio da GUI não são gerados a partir de um shell. Portanto, existem vários mecanismos concorrentes para definir variáveis ​​de ambiente para eles verem, que mudaram ao longo dos anos .
  • Trechos que chamam .bashrcde .bash_profilesão bastante comuns. Eu não recomendo isso, mas é uma preferência.

Por que exatamente o uso .bash_profilede aliases é complicado? Os itens que você lista apenas parcialmente são sobre aliases; portanto, em vez de apenas listar alguns marcadores que possam explicar por que parece ser complicado, você pode propor uma maneira de tornar mais fácil essas restrições?
nohillside

Eu entendo o seu ponto. Não é que usar .bash_profile seja complicado. É que a maneira como os arquivos são chamados é complicada. Eu vou atualizar.
Leo

Chamar .bashrc de .bash_profile é recomendado no manual do GNU bash - caso contrário, como você define variáveis, etc., que você precisa tanto nas shells de login quanto nas não interativas?
Mark

Todo emulador de terminal que eu uso em diferentes sistemas operacionais tem a opção de executar novas janelas como um shell de login, xterm e Xfce, para citar apenas dois.
fd0
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.