Como atualizar todas as shells bash usando um comando / script?

8

Sempre que eu modifico meu arquivo .bashrc , eu tenho que ir para cada shell bash e fazer a fonte novamente para efetuar as alterações.

Existe uma maneira melhor de fazer isso? Algum comando executado uma vez fará automaticamente source ~/.bashrc em todas as shells bash abertas?

    
por Lazer 18.06.2011 / 12:20

2 respostas

6

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

Muitos processos daemon são projetados para isso. A maneira típica seria enviar o sinal HUP (hangup), que faz com que eles relançem depois de reler seus arquivos de configuração. Você poderia acionar isso com algo como:

pkill -HUP daemon_name

No entanto, ao fazer isso no bash, o bash simplesmente desliga. Não é um daemon e o sistema não tem que se comportar como um.

O longo e o curto é que você provavelmente não continuará fazendo mudanças em seu bashrc com tanta freqüência com o passar do tempo e não será um grande problema. Quando você fizer mudanças, você terá apenas que re-fonte do arquivo, se você precisar das alterações em shells em execução.

    
por 18.06.2011 / 12:45
2

Não há nada embutido no bash. Você poderia dizer que talvez recarregasse .bashrc cada vez que exibisse um prompt, através de 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

Isso é um grande problema para um arquivo extra acessar o que vale a pena. Além disso, ele coloca uma restrição em seu .bashrc : o arquivo deve ser idempotente, ou seja, você deve poder carregá-lo mais de uma vez sem efeitos negativos. Por exemplo, no snippet acima, tenho o cuidado de adicionar maybe_reload_bashrc a PROMPT_COMMAND apenas se já não estiver lá.

    
por 18.06.2011 / 16:26