Des signaux créatifs et impliquant, dites-vous? D'ACCORD:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Jetez cela .bashrc
et partez. Cela utilise des signaux pour indiquer à chaque bash
processus de vérifier les nouvelles entrées d'historique quand un autre se ferme. C'est assez horrible, mais ça marche vraiment.
Comment ça marche?
trap
définit un gestionnaire de signaux pour un signal système ou l'un des événements internes de Bash. L' EXIT
événement est une terminaison contrôlée du shell, alors qu'il USR1
s'agit d' SIGUSR1
un signal insignifiant que nous nous approprions.
Chaque fois que le shell sort, nous:
- Ajoutez explicitement tout l'historique au fichier.
- Désactivez le
SIGUSR1
gestionnaire et faites en sorte que ce shell ignore le signal.
- Envoyez le signal à tous les
bash
processus en cours d'exécution du même utilisateur.
Quand un SIGUSR1
arrive, nous:
- Chargez toutes les nouvelles entrées du fichier d'historique dans la liste d'historique en mémoire du shell.
En raison de la façon dont les signaux poignées Bash, vous ne serez pas en réalité les nouvelles données d'histoire jusqu'à ce que vous frappez Enterla prochaine fois, si cela ne fait pas mieux sur ce plan que la mise history -n
en PROMPT_COMMAND
. Il enregistre la lecture du fichier en permanence quand rien ne s'est passé, cependant, et il n'y a aucune écriture du tout jusqu'à ce que le shell se termine.
Il reste cependant quelques problèmes ici. La première est que la réponse par défaut à SIGUSR1
est de terminer le shell. Tous les autres bash
processus (exécutant des scripts shell, par exemple) seront tués. .bashrc
n'est pas chargé par des shells non interactifs. Au lieu de cela, un fichier nommé par BASH_ENV
est chargé : vous pouvez définir cette variable dans votre environnement globalement pour pointer vers un fichier avec:
trap '' USR1
en elle pour ignorer le signal en eux (ce qui résout le problème).
Enfin, bien que cela fasse ce que vous avez demandé, la commande que vous recevrez sera un peu inhabituelle. En particulier, des morceaux d'historique seront répétés dans différents ordres au fur et à mesure qu'ils sont chargés et enregistrés séparément. C'est essentiellement inhérent à ce que vous demandez, mais sachez que l'historique des flèches vers le haut devient beaucoup moins utile à ce stade. Les substitutions d'histoire et autres seront partagées et fonctionneront bien, cependant.