Por que o .bashrc não é executado automaticamente?

202

Coloquei alguns comandos de alias no meu .bashrcarquivo, para que eles possam ser carregados toda vez que abro uma nova janela do Terminal. No entanto, isso não acontece.

Eu tenho que selecionar run script:no Terminal> Preferências> " MyDefaultTheme "> Shell prefpane e adicionar: source .bashrc && clearpara que ele funcione ...

Isso parece estranho, já que muitos tutoriais dizem apenas que você precisa adicionar ao .bashrcarquivo e tudo está bem.

Observe que eu não corro bashao usar o terminal, gosto do outro (padrão) (não sei o que é) melhor, porque me mostra onde estou o tempo todo, por exemplo:

>>d54c6b47b:~ romeo$

ao invés de:

>>bash$

No bash, tudo é carregado como deveria.

Portanto, minha pergunta é: por que meu .bashrcarquivo não foi carregado automaticamente e eu tive que adicionar a opção de chamá-lo sempre?

Além disso, algum tutorial me disse para fazer algo como:

$alias la=’ls -la >> ~/.bashrc

que deve escrever o alias para o meu .bashrc, isso também não funciona ...

Note que eu sou um novato em UNIX, então seja gentil.

Romeovs
fonte
Acho que isso está muito próximo de apple.stackexchange.com/questions/7984/… .
boehj
@boehj bem, ele menciona "não carregando .bashrc", mas é isso.
Jari Keinänen
OK, desculpe se eu confundi as coisas aqui.
boehj
Você provavelmente gosta csh(ou outra variante) melhor. Mas você deve saber que o >>bash$pode ser alterado :)
vol7ron
Se você deseja que os comandos executem onload , crie .profileem seu diretório pessoal #
Kolob Canyon

Respostas:

94

Basta colocar isso no seu .profilearquivo a partir do diretório home e ele deve funcionar na próxima vez que você iniciar um novo shell ou depois de executarsource ~/.profile

Este link indica claramente a ordem na qual os arquivos de inicialização são lidos e carregados pelo shell: http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup

Cosu
fonte
aceitou este porque tem uma solução (e foi o primeiro de dois posts quase idênticos).
romeovs
37
Down-vote. Eu recomendo não seguir este conselho. O problema é que o Terminal cria shells de login, e os shells de login do Bash executam apenas o script de inicialização do login, não ~/.bashrc. No entanto, a solução não é simplesmente colocar seu .bashrcconteúdo no arquivo de inicialização do logon, porque esses dois arquivos devem executar diferentes tipos de configuração. Em vez disso, a configuração canônica do Bash é ter sua ~/.bash_profilefonte ~/.bashrcem algum momento apropriado do script (geralmente o último).
Chris Página
Não vejo outra posto idêntico este apenas diz colocado no arquivo sh
Mark
218

Estive lá, fiz isso. Do que soube, o OS X não lê o .bashrcarquivo no bash start. Em vez disso, ele lê os seguintes arquivos (na seguinte ordem):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

Veja também o comentário informativo e útil de Chris Johnsen :

Por padrão, o Terminal inicia o shell via /usr/bin/login, o que torna o shell um shell de login. Em todas as plataformas (e não apenas Mac OS X) o bash não usa .bashrcpara shells de login (somente /etc/profilee o primeiro de .bash_profile, .bash_login, .profileque existe e é legível). É por isso que "colocar source ~/.bashrcno seu .bash_profile" é um conselho padrão

Eu normalmente apenas colocar as coisas que eu normalmente colocados em ~/.bashrcque ~/.profile- tem funcionado até agora como um encanto.

Jari Keinänen
fonte
38
Por padrão, o Terminal inicia o shell via /usr/bin/login, o que torna o shell um shell de login. Em todas as plataformas (e não apenas Mac OS X) o bash não usa .bashrcpara shells de login (somente /etc/profilee o primeiro de .bash_profile, .bash_login, .profileque existe e é legível). É por isso que "colocar source ~/.bashrcno seu .bash_profile" é um conselho padrão.
Chris Johnsen
5
Re "Normalmente, apenas coloco as coisas que normalmente coloco em ~ / .bashrc em ~ / .profile": para obter compatibilidade máxima, recomendo que você siga os conselhos de Chris Johnsen e coloque tudo o que deseja aplicar em shells de não login em ~ / .bashrc e adicione "source ~ / .bashrc" ao seu ~ / .bash_profile para executá-lo nos shells de login. Caso contrário, ele não funcionará para subconchas, ou se o Terminal mudar para criar shells sem logon, ou se você usar o xterm ou outro programa de terminal que crie shells sem logon por padrão, ou se desejar usar o mesma configuração em outro sistema operacional.
Chris Page
4
Em uma observação relacionada, no Mac OS X você deve considerar executar ~ / .bashrc / etc / bashrc para captar comportamentos globais. Em particular, há código em / etc / bashrc para atualizar o diretório ativo a cada prompt, o que permite ao Terminal exibir o ícone de proxy, criar novos terminais no mesmo diretório e restaurar o diretório ativo para Grupos de Currículos e Janelas.
Chris Page
Para mim, a fonte .bashrc de .bash_profile não funcionou. Mas o fornecimento de .bashrc / .bash_profile a partir de .profile funcionou.
Ken Russell
2
Boa resposta, mas um pouco desinformada. Eu acredito que as cargas terminais festa única um do ~/.bash_profile, ~/.profile, ~/.bash_login, não toda a elas. Você pode executar um teste simples criando os 3 arquivos. Parece que o terminal do bash tem a preferência de ~/.bash_profile> ~/.bash_login> ~/.profile. Se qualquer um deles existir, os de menor preferência serão ignorados. É por isso que às vezes é recomendado para também fonte ~/.profileem ~/.bash_profile.
Neurite
25

Coloquei tudo em ~/.bashrce apenas source ~/.bashrcem .profile.

Isso permite que as sessões screen e xterm (e eu acho que tmux) herdem meu ambiente, pois as sessões sem login são executadas apenas .bashrc, enquanto as sessões de login (por exemplo, terminal ou iTerm) são executadas apenas .profile.

anu
fonte
11
Esta é a minha abordagem. Dessa forma, posso manter um .bashrc que funcione nos dois sistemas ... e posso colocar qualquer material específico do mac ou alias que sejam apenas para trabalho (onde eu mais uso o mac) no meu arquivo .bash_profile.
Michael Durrant
2
Observe que .profileé comum a vários shells e só deve conter código sh compatível com POSIX. Se for originado, .bashrcé possível que ele contenha código específico do Bash (a existência do .bashrcarquivo é específica do Bash). Eu recomendo renomear seu nome .profilepara, .bash_profilepois você o está usando de uma maneira específica do Bash. Ou, insira um código genérico .profilee crie uma .bash_profiledessas fontes .profilee .bashrc.
Chris Página
19

Existem dois cenários:

  1. Você está usando Linux
  2. Você está usando o Mac Os X

Para ambos, você deseja obter ~/.bashrcem seu perfil o carregamento ou a origem do seu perfil quando o shell do seu terminal iniciar.


LINUX

No Linux, ~/.profileé automaticamente fonte no seu shell quando é iniciado. Portanto, se você for ao seu terminal e digitar cd ~; ls -A, verá todos os seus arquivos e diretórios no seu diretório pessoal ( /home/usrname/). Você deve ver um arquivo chamado .profile. Este é o arquivo que é automaticamente "originado" quando você inicia o terminal.

Se você deseja adicionar aliases e funções a ~/.bashrc(que é o que eu faço), você deve (dentro de ~/.profileadicionar uma instrução if que verifique se ~/.bashrcé um arquivo não vazio e, em seguida, origine-o.

Para verificar se você ~/.profilejá faz isso, insira nano ~/.profile. Isso o abrirá em um editor de texto (você pode usar o gedit se souber que possui ou mesmo o vim se souber como usá-lo). Você pode obter um arquivo de texto vazio (não deveria), mas se você simplesmente prosseguir. Se você não vir uma linha em qualquer lugar que diga source ~/.bashrc, digite as seguintes linhas em algum lugar (coloque-a em um local razoável, como no final ou no início, e não no meio de uma instrução if):

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

Isso verifica se ~/.bashrcé um arquivo não vazio (com if [ -s ~/.bashrc ]) e, se é, fornece o arquivo . Bem simples. Agora, você pode adicionar qualquer alias válido, função, variável, etc para ~/.bashrc.


MAC OS X

Por padrão, fontes de Max OS X ~/.bash_profile. Para poder adicionar coisas ~/.bashrc(que também é o que faço no OS X), siga o mesmo procedimento que o linux. No terminal, digite cd ~; nano .bash_profile. Verifique se há uma linha que diz source ~/.bashrce, se não estiver lá, adicione a instrução if acima ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi).


NOTAS

Ao escrever uma declaração if, certifique-se de deixar espaços entre basicamente tudo (por exemplo if [ -s ~/.bashrc]; then echo "found"; fi, não funciona porque não há espaço entre - ~/.bashrce ]o intérprete pensará que essa é uma palavra).

Se você quiser descobrir como verificar melhor as coisas em uma instrução if, vá para o terminal e digite man \[; isso essencialmente fornece o detalhamento de uma instrução if. Por exemplo, if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fiverifica se /path/to/fileé um arquivo e se ele é impresso em stdout adequadamente. Eu sempre refiro isso também para uma referência mais fácil e rápida: 7.2. Operadores de teste de arquivo .

Eu espero que isso ajude. Lembro como fiquei confuso quando comecei todas essas coisas (que não faz muito tempo); então, boa sorte com seus futuros empreendimentos UNIX!

Dylan
fonte
No Linux, .profilesó é originária se o seu shell é um shell de login, caso contrário, .bashrcé originária
smac89
11

Fornecer .profile em .bash_profile fez isso por mim

echo 'source ~/.profile' >> ~/.bash_profile
Luis S
fonte
11
Fornecer .profile no .bash_profile é uma grande coisa a se fazer, mas isso por si só não faria com que o .bashrc fosse executado por shells de login. Seu .profile já deve ter originado .bashrc, o que pode causar problemas se você usar um shell que não seja o bash. A maioria dos usuários de Mac nunca o fará, mas se você o fizer por algum motivo, lembre-se disso. :)
Terry N
Para expandir o que o @TerryN disse: não se esqueça de procurar .bashrcno seu .bash_profilee não no .profile. .bash_profileé específico do Bash e deve buscar os outros dois.
Chris Página
6

Descobri que, depois de instalar o rvm (auto-installer, sem edições manuais), ele havia criado um ~/.bash_loginarquivo para si, onde anteriormente nunca tinha um.

No entanto, isso significa que minhas ~/.profileconfigurações e aliases não foram mais carregados! Muitos atalhos desapareceram. Eu pensei que eles corriam seqüencialmente, não exclusivamente: - /

Eu adicionei

. ~/.profile 

para ~/.bash_loginencadear as coisas como eu esperava.

dman
fonte
+1, esta é a situação que tive. Descobri que .bash_login ou .bash_profile impedirá a execução do .profile ... Não faço ideia por que o bash sente a necessidade de ter tantos arquivos de inicialização conflitantes.
RichVel
.profileé comum a vários shells diferentes e deve conter apenas código sh compatível com POSIX. .bash_profileé específico do Bash e pode conter código específico do Bash. Em geral, se você estiver usando o Bash, deverá preferir, a .bash_profilemenos que tenha cuidado para garantir que seu código de inicialização não contenha nada que dependa do Bash. Qualquer programa criado .bash_loginprovavelmente o fez porque contém código específico do Bash, mas deveria ter incluído o código na origem, .profilese existir.
Chris Página
3

Colocando ...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... no ~/.bashrce, em seguida, a fonte ~/.bashrcno meu ~/.bash_profile não funcionou para o programa Terminal que vem instalado.

Mas depois fui ao menu suspenso Editar> Preferências do perfil , guia Título e comando , e selecionei Executar comando como um shell de login na seção de comandos dessa página.

Depois de fazer isso, iniciar um novo terminal mostra o resultado desejado quando digito

 type rvm|head -1

ie "rvm é uma função". Ele não fez isso até que eu fiz essa mudança, e é a única mudança que eu fiz depois que os .bash_profilee .bashrcalterações descritas em outras respostas aqui.

LiquidMark
fonte
2

Antes de tudo, deixe-me dizer que esse ~/.bashrcé o arquivo que é executado toda vez que um segundo shell é chamado (ao executar um script de shell, por exemplo), e ~/.profileé chamado em todo login.

Por isso, recomendo que você escreva o . ~/.bashrccomando em seu ~/.profilearquivo, e esse comando executará o arquivo bashrc toda vez que você fizer login.

Arun Rana
fonte
quando o .profile é executado no login, ele executa automaticamente o arquivo .bashrc.
Arun rana
assim .bashrc é executado indiretamente a cada logon
rana arun
11
O bashrc é para shells sem login. bash_profile / bash_login / profile / o que mais for para shells de login. Isso é fonte de uma enorme quantidade de contendas, envolvendo o que é e o que não é um shell de login (uma sessão screen / tmux, por exemplo, um terminal em um ambiente de desktop, etc.). Não é necessariamente a "segunda concha". É uma questão de entrada do shell.
Jason SALAZ
3
Se você usar um shell que não seja o Bash, fazer o que você descreve pode causar problemas. .profile se aplica a todos os shells e .bashrc pode conter linguagem que alguns outros shells não entendem. Em vez de .profile, coloque o que você escreveu em .bash_profile. (Além disso, fazer a primeira coisa Bash_profile faz ser ".profile fonte".)
Terry N
1

Corri para o mesmo problema depois de instalar o rbenv no meu servidor remoto (Digital Ocean) Ubuntu 16.04.

De alguma forma, criou ~/.bash_profile. É o mesmo ~/.bashrcem um sistema OS X.

E o Ubuntu começou a ler apenas ~/.bash_profile, mas não ~/.bashrccomo deveria.

Então, eu apenas fiz backup dos meus dados ~/.bash_profilecom isso:

mv ~/.bash_profile ~/.bash_profile.bak

E renomeou o antigo ~/.bashrcpara~/.bash_profile

mv ~/.bashrc ~/.bash_profile

Funcionou para mim. Após o meu login ssh, tenho tudo carregado ~/.bashrc.

zhisme
fonte
0

Caso isso possa ajudar mais alguém ...

Certifique-se de editar o .bashrcarquivo certo para o usuário certo. Eu tive um problema semelhante ao usar o Vagrant. Depois de executar vagrant sshmeu .bashrcarquivo não estava sendo executado. A solução foi simples, pois pensei que o vagrant estava fazendo login com o usuário chamado vagrant e, na verdade, estava fazendo login como outro usuário. Então, eu estava editando o .bashrcarquivo errado . Depois de editar o .bashrcarquivo correto, meus apelidos foram reconhecidos.

Allen
fonte
-1

A propósito, se você ativou o ZSH, ele substitui o bash!

Portanto, todos esses ~/.bashrcarquivos não são carregados.

Você precisa definir seus aliases ~/.zshrc.

Frédéric Adda
fonte
-2

Para manter o login no estilo OSX .profilee suportar o comportamento normal do bash, .bashrcvocê pode usar um .bashrcarquivo se alternar entre o nix normal e o OSX, fornecendo um link simbólico para o seu .bashrcarquivo chamado .bash_profile. Apenas verifique se esse arquivo já não existe antes de tentar isso, mas é assim que eu faço.

ln -s .bashrc .bash_profile
Inkspeck
fonte
Ao fazer essa ligação entre dois scripts de inicialização diferentes do shell, você está perdendo a necessária separação de funções. Um dia ou outro, você precisará de uma inicialização no nível da sessão ( .bash_profile) e uma inicialização diferente em cada nível do shell ( .bashrc).
dan
-2

/ etc / bashrc é para perfis globais em sistemas Mac. Você pode adicionar: alias ls = "ls -G" na parte superior deste arquivo e, para o seu bem, todos terão arquivos e pastas coloridos no sistema, para que você não precise definir nada extra para cada usuário. Você também notará que, juntamente com "sudo su -", para remover sua raiz, ainda terá arquivos e pastas coloridos sem dores de cabeça extras.

Outra dica divertida: ao usar o Iterm2 do mac, a importação de perfis de cores renderizará a coloração dos arquivos e pastas imediatamente de acordo com o esquema de cores, após a opção "/ etc / bashrc".

Sulayman Touray
fonte