Como recarrego o .bashrc sem sair e entrar novamente?


Respostas:


2638

Você apenas precisa digitar o comando:

source ~/.bashrc

ou você pode usar a versão mais curta do comando:

. ~/.bashrc

88
Isso não é exatamente o mesmo que fazer login e sair. Digamos que você tenha a seguinte linha em .bashrc: export PATH=$PATH:fooe altere-a para export PATH=$PATH:bar. Se você efetuar login e sair, apenas barestará no PATH, mas se você fizer o que sugere, ambos fooe barestará no PATH. Você conhece uma maneira de contornar isso?
— precisa saber é o seguinte

7
@ HighCommander4 - uma maneira muito insatisfatória de fazer o que você quer é fazer "bash -l"; no entanto, isso cria um novo subshell e, quando você sair, retornará ao shell em que "foo" ainda está no PATH. Se você está interessado apenas no PATH, você pode "desabilitar o PATH" e reconstruí-lo do zero, mas provavelmente mais fácil / seguro é "PATH = / bin: / usr / bin" antes de procurar o seu .bashrc. A forma como a variável PATH é criada no login é realmente razoavelmente complexa, envolvendo no mínimo a entrada do login (consulte "man login") e / etc / profile (consulte "man bash").
— 9133 George Hawkins

2
@ Alex, você pode automatizá-lo adicionando a linha ~ / .bashrc em ~ / .bash_profile, embora eu não saiba se essa é uma boa prática.
— Vivek Gani

4
Eu também recomendaria a criação de um alias (que você pode armazenar em ~ / .bashrc ou ~ / .bash_aliases) que abre .bashrc e o recarrega após a saída do editor. Você pode fazê-lo através da combinação de dois comandos em um alias, por exemplo assim (se vim é o seu editor preferido, caso contrário, trocá-lo para outra coisa): alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Isso tornará a edição muito mais suave, pois você não precisará pensar em recarregar, depois de fazer a edição, se estiver usando o alias personalizado.
— Samuel Lampa

6
Isso afetará apenas o terminal atual.
— matepal297

284

Ou você pode usar:

exec bash

Isso faz a mesma coisa e é mais fácil de lembrar (pelo menos para mim).

O execcomando substitui completamente o processo do shell executando a linha de comando especificada. Em nosso exemplo, ele substitui qualquer que seja o shell atual por uma nova instância de bash(com os arquivos de configuração atualizados).


13
Você poderia explicar a diferença de source .bashrccomando e exec bash?
— Muradin

18
@muradin, sourceé um comando interno do shell que executa o conteúdo do arquivo passado como argumento, no shell atual . Portanto, no seu exemplo, ele executa o arquivo .bashrc no shell atual. E execcomando substitui o shell com um determinado programa, no seu exemplo, ele substitui o shell com bash (com os arquivos de configuração atualizados)
— WhoSayIn

3
Na minha circunstância hiperespecífica, isso totalmente abalou. Meu Dockerfile executa um script de instalação que modifica .bashrc. Preciso recarregar, mas . ~/.bashrcserá executado em dashvez de bash, para que haja um erro porque shoptestá faltando. sourcenão é encontrado no shell, então essa solução também está disponível. Eu tentei isso e a imagem do docker foi criada sem problemas!
— m59 2/06/2015

9
Elegante, mas "faz a mesma coisa" não está totalmente correto. source ~/.bashrcpreservará todo o ambiente do shell (embora provavelmente modificado pela fonte de ~/.bashrc), enquanto exec bashpreservará apenas as variáveis ​​de ambiente atuais do shell (quaisquer alterações ad-hoc no shell atual em termos de variáveis, função e opções do shell são perdidas). Dependendo das suas necessidades, uma ou outra abordagem pode ser preferida.
— precisa saber é o seguinte

12
@ SEoF, quando você diz "bash inception" e se você está pensando o que eu acho que você está pensando, devo dizer que você está errado. Ao contrário do filme, você não continua entrando no bash quando repetidamente exec bash. O execcomando substitui o shell pelo programa, no nosso caso, bash. Portanto, sempre existe uma instância de bash no terminal.
— John

121

Para complementar e contrastar as duas respostas mais populares . ~/.bashrce exec bash:

As duas soluções são recarregadas com eficiência~/.bashrc , mas há diferenças:

  • . ~/.bashrcou source ~/.bashrcvai preservar o seu shell atual :

    • Exceto pelas modificações feitas ~/.bashrcpelo recarregamento no shell atual ( fornecimento ), o shell atual e seu estado são preservados , o que inclui variáveis ​​de ambiente, variáveis ​​de shell, opções de shell, funções de shell e histórico de comandos.
  • exec bash, ou, de maneira mais robusta, exec "$BASH"[1] , substituirá seu shell atual por uma nova instância e, portanto, preservará apenas as variáveis ​​de ambiente do seu shell atual (incluindo aquelas que você definiu ad-hoc).

    • Em outras palavras: Quaisquer alterações ad-hoc no shell atual em termos de variáveis, funções do shell, opções do shell e histórico de comandos são perdidas.

Dependendo das suas necessidades, uma ou outra abordagem pode ser preferida.


[1] exec bashpoderia, em teoria, executar um executável diferente bash daquele que iniciou o shell atual, se ele existir em um diretório listado anteriormente no $PATH. Como a variável especial $BASHsempre contém o caminho completo do executável que iniciou o shell atual, exec "$BASH"é garantido o uso do mesmo executável.
Uma nota de re "..."torno $BASH: dupla garante-citando que o valor da variável é utilizada tal como está, sem interpretação por Bash; se o valor não tiver espaços incorporados ou outros metacaracteres do shell (o que provavelmente não é o caso), você não precisará estritamente de aspas duplas, mas usá-las é um bom hábito.


Você respondeu minha pergunta antes que eu pudesse perguntar. É bom saber disso; Costumo definir meu CLASSPATH para uma única sessão.
— swinefish

Portanto, mesmo se eu chamar exec "$ BASH", as variáveis ​​que os conjuntos .bashrc serão encontradas no shell que eu abrir em seguida (usando o mesmo executável da minha sessão atual)?
— Nitinr708

3
@ nitinr708: Sim, exec $BASHserá fonte ~/.bashrc, então você verá suas alterações no ambiente do shell na nova sessão.
— precisa saber é o seguinte

@ Gaming32, aprecio a ideia de uma nota de rodapé hiper-vinculada, mas na verdade não funcionou (e em uma resposta tão curta quanto esta, não é tão importante).
— precisa saber é o seguinte

44

Alguém editou minha resposta para adicionar um inglês incorreto, mas aqui estava o original, que é inferior à resposta aceita.

. .bashrc

25
Isso funcionará apenas se o diretório atual for realmente o diretório inicial. O seguinte irá funcionar:. ~ / .bashrc
— Brian Showalter

6
O que faz isso funcionar? O que realmente está acontecendo quando eu faço ". .Bashrc"? Obrigado!
— precisa

54
. é um atalho BASH para o comando interno "source". Portanto, ".bashrc" é o mesmo que "source .bashrc" para o intérprete BASH.
— precisa

7
Legal. Obrigado. Agora que eu não sabia.
— precisa

2
Eu só apresentou um pedido de edição para adicionar ~/, mas desde que as principais respostas mostra tanto source ~/.bashrce . ~/.bashrcgostaria de saber se esta resposta deve apenas ser eliminada por ser redundante.
— Max Ghenis

18

Dependendo do seu ambiente, basta digitar

bash

também pode funcionar.


15
No entanto, isso invocará um novo shell no atual, desperdiçando recursos. Melhor usar a solução exec do @ WhoSayln, que substitui o shell atual pelo recém-invocado.
— Bernhard Wagner

Sim, basta usar a fonte. Isso é totalmente desnecessário e irritante.
— Dllnmc 23/09/14

Além @ comentário de BernhardWagner, você também perder o seu histórico do bash atual, caso o gerar um novo shell
— peterchaula

Essa é uma boa solução, na qual o acesso aos privilégios do usuário é limitado.
— Tunde Pizzle

invocar um subprocesso adiciona uma camada de complexidade que não tem valor adicional.
— Alan Berezin

18

Com isso, você não vai mesmo ter que digitar "source ~ / .bashrc":

Inclua seu arquivo bashrc:

alias rc="vim ~/.bashrc && source ~/.bashrc"

Toda vez que você quiser editar seu bashrc, basta executar o alias " rc "


15
. ~/.bashrc

. é um built-in mandatado pelo POSIX


Alternativas

source ~/.bashrc

sourceé sinônimo de ponto / período .no bash, mas não no POSIX sh, portanto, para obter compatibilidade máxima, use o período.

exec bash
  • execcomando substitui o shell por um determinado programa ... - WhoSayIn

2
exec bashainda herda o ambiente do shell atual. exec env -i bashestaria mais perto (ou exec env -i bash -lse você estiver atualmente em um shell de login).
— Chepner # 16/17

5

Dependendo do seu ambiente, convém adicionar scripts para que o .bashrc seja carregado automaticamente quando você abrir uma sessão SSH. Recentemente, fiz uma migração para um servidor executando o Ubuntu e lá, .profile, não .bashrc ou .bash_profile é carregado por padrão. Para executar qualquer script no .bashrc, eu precisava executar source ~/.bashrctoda vez que uma sessão era aberta, o que não ajuda na execução de implantações remotas.

Para que o seu .bashrc seja carregado automaticamente ao abrir uma sessão, tente adicioná-lo ao .profile:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Reabra a sua sessão e ela deverá carregar os caminhos / scripts existentes no .bashrc.


Eu tenho isso em ".profile", mas não está funcionando - cada vez que saio, tenho que fazê-lo manualmente. Alguma sugestão?
— Wayne Smallman

4

Usei o easyengine para configurar meu servidor baseado em nuvem vultr.
Encontrei meu arquivo bash em /etc/bash.bashrc.

O mesmo source /etc/bash.bashrcfez o truque para mim!

atualizar

Ao configurar um servidor bare (ubuntu 16.04), você pode usar as informações acima, quando ainda não configurou um nome de usuário e está fazendo login via root.

É melhor criar um usuário (com privilégios sudo) e fazer login como esse nome de usuário.
Isso criará um diretório para suas configurações, incluindo arquivos .profile e .bashrc.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

Agora, você irá editar e (e "fonte") o ~/.bashrcarquivo.

No meu servidor, ele estava localizado em /home/your_username/.bashrc
(onde your_usernameé, na verdade, o novo nome de usuário que você criou acima e agora efetue login)


4

exec bash é uma ótima maneira de reexecutar e lançar um novo shell para substituir o atual. apenas para adicionar à resposta, $ SHELL retorna o shell atual que é bash. Usando o seguinte, ele recarregará o shell atual e não apenas o bash.

exec $SHELL -l;


3

Para mim, o que funciona quando altero o PATH é: exec "$BASH" --login


A questão é de cerca de recarga ~/.bashrc, que --loginserá não (directamente) de recarga; no nível do usuário, ele será recarregado ~/.bash_profile(ou ~/.bash_loginou ~/.profile).
— mklement0

3

tipo:

source ~/.bashrc

ou, em formato mais curto:

. ~/.bashrc


1
Novamente, funciona apenas se você estiver no diretório inicial ou, mais precisamente, no diretório em que .bashrcestá localizado. Uma maneira mais correta de fazer isso, como dito na resposta aceita, é source ~/.bashrc.
— John

2

eu uso o seguinte comando no msysgit

. ~/.bashrc

versão mais curta de

source ~/.bashrc

@jwg a resposta aceita é. .bashrc. funcionará apenas se você estiver no diretório inicial no msysgit.
— Sojan V Jose

@ jwg ok i thin eu estava mencionando que você não precisa digitar 'source ~ / .bashrc' em vez disso, use a versão mais curta.
— Sojan V Jose

@jwg tudo bem eu adicionei-lo como editar a resposta original :)
— Sojan V Jose

Por que a resposta redundante @Sojan?
— Nitinr708

@ nitinr708 2014. eu mal me lembro: p. a resposta original foi editada mais tarde, algo que eu acho.
— Sojan V Jose

2

Assumindo um shell interativo, e você gostaria de manter seu histórico de comandos atual e também carregar / etc / profile (que carrega dados do ambiente, incluindo / etc / bashrc e no Mac OS X, carrega os caminhos definidos em /etc/paths.d/ path_helper), anexe seu histórico de comandos e execute um exec do bash com a opção de login ('-l'):

history -a && exec bash -l

1

Isso também vai funcionar ..

cd ~
source .bashrc

7
Sim, mas também altera o diretório de trabalho para ~, o que não é desejado.
— Albin

1
Obrigado por manter o contexto vivo @Krinkle
— nitinr708

É necessário especificar ~a alteração do diretório de trabalho para o diretório inicial do usuário?
— Kenly

1

Notei que o exec bashcomando puro preservará as variáveis ​​de ambiente, portanto, você precisa usar exec -c bashpara executar o bash em um ambiente vazio.

Por exemplo, você efetua login em um bash e export A=1, se você exec bash, em A == 1.

Se você exec -cl bash, Aestá vazio.

Eu acho que essa é a melhor maneira de fazer seu trabalho.


-2

eu pessoalmente tenho

alias ..='source ~/.bashrc'

no meu bashrc, para que eu possa usar ".." para recarregá-lo.


4
Muitas pessoas usam ..como um apelido para cd .., então será muito confuso.
— O Padrinho

exceto pelo nome do pseudônimo, uma boa idéia. alias rehash='source ~/.bashrc'é a minha escolha.
— 9138 Frank Nocke

use algo como "_rs", que eu uso como shell de recarga. eu praticamente uso _ para começar meus apelidos; que é semelhante ao js libs underscorejs ou lodash.
— Jimmy MG Lim
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.