Como recarrego o .bashrc sem sair e entrar novamente?

1645

Se eu fizer alterações .bashrc, como recarregá-lo sem sair e entrar novamente?

Jed Daniels
fonte

Respostas:

2638

Você apenas precisa digitar o comando:

source ~/.bashrc

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

. ~/.bashrc
George Hawkins
fonte
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).

WhoSayIn
fonte
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.

mklement0
fonte
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
Randy Proctor
fonte
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.

James
fonte
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 "

Roy Lin
fonte
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.

karolus
fonte
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)

SherylHohman
fonte
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;

Jimmy MG Lim
fonte
3

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

Cecília Assis
fonte
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

jwismar
fonte
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
Sojan V Jose
fonte
@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
beattidp
fonte
1

Isso também vai funcionar ..

cd ~
source .bashrc
kirti
fonte
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.

Gato cachorro
fonte
-2

eu pessoalmente tenho

alias ..='source ~/.bashrc'

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

Flo
fonte
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