Je sais que cette question n'est pas obscure, car elle est posée ici, continuez à mettre à jour (et dupliquez ici).
Ce que j'essaie de réaliser est un peu différent. Je n'aime pas l'idée de ma réécriture rapide d'un fichier chaque fois que ls
je tape ( history -a; history -c; history -r
).
Je voudrais mettre à jour le fichier à la sortie. C'est facile (en fait, par défaut), mais vous devez ajouter au lieu de réécrire:
shopt -s histappend
Maintenant, lorsqu'un terminal est fermé, je voudrais que tous les autres qui restent ouverts soient informés de la mise à jour.
Je préfère le faire sans vérifier via $PS1
tous ceux command
que je tape. Je pense qu'il serait préférable de capturer une sorte de signal. Comment feriez-vous cela? Si ce n'est pas possible, peut-être un simple cronjob
?
Comment pouvons-nous résoudre ce casse-tête?
la source
bash
. Peut-être qu'il est temps de vérifier quelque chose de nouveau, juste pour le plaisir.Réponses:
Des signaux créatifs et impliquant, dites-vous? D'ACCORD:
Jetez cela
.bashrc
et partez. Cela utilise des signaux pour indiquer à chaquebash
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'ilUSR1
s'agit d'SIGUSR1
un signal insignifiant que nous nous approprions.Chaque fois que le shell sort, nous:
SIGUSR1
gestionnaire et faites en sorte que ce shell ignore le signal.bash
processus en cours d'exécution du même utilisateur.Quand un
SIGUSR1
arrive, nous: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
enPROMPT_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 autresbash
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é parBASH_ENV
est chargé : vous pouvez définir cette variable dans votre environnement globalement pour pointer vers un fichier avec: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.
la source
.bashrc
fichier, puis que quelque chose comme un cronjob est venu et a utilisé le fichier périodiquement, en envoyant unSIGUSR1
extrait selon vous, si vous pouviez retrouver l'historique chronologique de la flèche vers le haut?linux bug
?? Pourquoi d'autres processus attrapent USR1? (Je sais que ce n'est pas censé être discuté ici, mais je vais peut-être mettre cela en lumière au bon endroit)BASH_ENV
comme indiqué dans cette réponse? Ou connaissez-vous un moyen plus standard d'éteindre ce mal?