Comment rafraîchir tous les shells bash en utilisant une commande / un script?

8

Chaque fois que je modifie mon .bashrcfichier, je dois aller dans chaque shell bash et le ressaisir pour effectuer les changements.

Y a-t-il une meilleure manière de faire cela? Une commande qui s'exécute une fois fera automatiquement un source ~/.bashrcdans tous les shells bash ouverts?

Lazer
la source

Réponses:

6

Non, je ne pense pas que ce soit possible. Cela ne devrait pas non plus. Cela reviendrait essentiellement à injecter du code dans un shell déjà lancé et actif et constituerait une menace de sécurité importante.

De nombreux processus démon sont conçus pour cela. La manière typique serait de leur envoyer le signal HUP (raccrochage) qui les fait relancer après avoir relu leurs fichiers de configuration. Vous pouvez déclencher cela avec quelque chose comme:

pkill -HUP daemon_name

Cependant, lorsque vous faites cela sur bash, bash s'arrête simplement. Ce n'est pas un démon et le système ne se comporte pas comme tel.

Le plus long et le plus court, c'est que vous ne continuerez probablement pas à apporter des modifications à votre bashrc aussi souvent que le temps passe et ce ne sera pas vraiment un problème. Lorsque vous apportez des modifications, vous n'aurez qu'à ressourcer le fichier si vous avez besoin des modifications dans les shells en cours d'exécution.

Caleb
la source
2

Il n'y a rien de intégré dans bash. Vous pourriez lui dire de se recharger à .bashrcchaque fois qu'il affichera une invite, via 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

C'est beaucoup de problèmes qu'un fichier supplémentaire accède pour ce qu'il vaut. De plus, cela met une contrainte sur votre .bashrc: le fichier doit être idempotent, c'est-à-dire que vous devez pouvoir le charger plus d'une fois sans aucun effet néfaste. Par exemple, dans l'extrait ci - dessus, je prends soin d'ajouter maybe_reload_bashrcà PROMPT_COMMANDseulement si elle est pas déjà.

Gilles 'SO- arrête d'être méchant'
la source
@Kevin J'ai rejeté votre modification, car il n'était pas clair quels avantages / inconvénients le code supplémentaire pourrait avoir. Gilles pourrait avoir un effet secondaire à l'esprit qu'il évitait en gardant la comparaison d'horodatage juste au cas où le fichier a changé depuis l'original et en se chargeant toujours à chaque commande s'il est changé une seule fois. Si vous pensez qu'il y a vraiment un bug, laissez un commentaire ici et je suis sûr qu'il sera corrigé.
Caleb
2
@Caleb: Kevin ne sera pas informé par votre commentaire. Pour référence, la modification suggérée doit être exécutée touch -r ~/.bashrc $bashrc_timestamp_fileaprès le sourcing ~/.bashrc. En fait, j'ai presque écrit cela, mais ce n'est pas nécessaire: cela vient d'être fait par les sources .bashrc. Le fichier d'horodatage est mis à jour chaque fois qu'il .bashrcest chargé, pas seulement lors du chargement initial.
Gilles 'SO- arrête d'être méchant'