Como atualizar todos os shells bash usando um comando / script?

8

Sempre que modifico meu .bashrcarquivo, tenho que ir para cada shell bash e fonte-lo novamente para efetuar as alterações.

Existe uma maneira melhor de fazer isso? Algum comando executado uma vez fará automaticamente um source ~/.bashrcem todos os shells do bash aberto?

lazer
fonte

Respostas:

6

Não, acho que isso não é possível. Nem deveria ser. Basicamente, isso representaria uma maneira de injetar código em um shell já iniciado e ativo e representaria uma ameaça significativa à segurança.

Muitos processos daemon são projetados para fazer isso. A maneira típica seria enviar a eles o sinal HUP (hangup), que os leva a reiniciar depois de reler seus arquivos de configuração. Você pode acionar isso com algo como:

pkill -HUP daemon_name

No entanto, ao fazer isso no bash, o bash é desligado. Não é um daemon e o sistema não se comporta como um.

O longo e o curto é que você provavelmente não continuará fazendo alterações no seu bashrc com tanta frequência com o passar do tempo e isso não será um problema. Quando você faz alterações, você apenas precisará refazer a fonte do arquivo se precisar das alterações na execução de shells.

Caleb
fonte
2

Não há nada incorporado ao bash. Você pode dizer para talvez recarregar .bashrcsempre que exibir um prompt, até PROMPT_COMMAND.

## Create a timestamp file, dated like the .bashrc that was read.
## There is a small race condition: if .bashrc is modified as the shell is
## just starting, before getting to this line, this instance won't detect
## that modification.
bashrc_timestamp_file=~/.bashrc-timestamp-$$
touch -r ~/.bashrc "$bashrc_timestamp_file"
## Remove the timestamp file on exit. The timestamp file will be left
## behind on a crash.
trap 'rm "$bashrc_timestamp_file"' EXIT HUP TERM INT QUIT
maybe_reload_bashrc () {
  if [[ ~/.bashrc -nt $bashrc_timestamp_file ]]; then
    . ~/.bashrc
  fi
}
if [[ $PROMPT_COMMAND != *maybe_reload_bashrc* ]]; then
  PROMPT_COMMAND="maybe_reload_bashrc
$PROMPT_COMMAND"
fi

É um monte de problemas que um arquivo extra acessa pelo que vale a pena. Além disso, isso restringe o seu .bashrc: o arquivo deve ser idempotente, ou seja, você deve poder carregá-lo mais de uma vez sem causar efeitos negativos. Por exemplo, no trecho acima, eu tomo o cuidado de acrescentar maybe_reload_bashrcque PROMPT_COMMANDsomente se ele não está lá já.

Gilles 'SO- parar de ser mau'
fonte
@ Kevin Eu rejeitei sua edição porque não estava claro quais vantagens / desvantagens o código extra poderia ter. Gilles poderia ter um efeito colateral em mente que ele estava evitando mantendo a comparação do carimbo de data / hora apenas se o arquivo foi alterado desde o original e sempre carregando todos os comandos se ele foi alterado uma única vez. Se você acha que realmente existe um bug, deixe um comentário aqui e tenho certeza de que será corrigido.
Caleb
2
@Caleb: Kevin não será notificado por seu comentário. Para referência, a edição sugerida é executada touch -r ~/.bashrc $bashrc_timestamp_fileapós a fonte ~/.bashrc. Na verdade, eu quase escrevi isso, mas não é necessário: foi feito apenas pelo fornecedor .bashrc. O arquivo de carimbo de data e hora é atualizado sempre que .bashrccarregado, não apenas no carregamento inicial.
Gilles 'SO- stop be evil'