Question Est-il possible de faire écrire à .bash_history immédiatement?


J'ouvre souvent beaucoup de terminaux [J'ai maintenant 7 ouvert sur cet espace de travail] et je recherche souvent history avec grep pour trouver une commande que je viens d'écrire récemment, mais je ne veux pas traquer le terminal, puis faire défiler vers le haut et le chercher plus, etc. Parfois, mes terminaux se ferment sans «sortir» et tout ce que j'ai écrit est perdu [Parfois, j'avais besoin de quelque chose que j'avais écrit dans un terminal qui avait été tué].

Y a-t-il un moyen de le faire pour que chaque terminal écrive immédiatement à .bash_history? ou au moins une fois par minute, ou quelque chose comme ça?


100
2017-10-16 03:09


origine


Normalement j'utilise control-r pour inverser la recherche dans l'historique de commandes d'un bash. Plus pratique que history | grep sauf si vous avez besoin d'une expression régulière. - Peter Cordes


Réponses:


Une solution simple comme détaillé dans Mettre à jour l'historique de Bash en temps réel.

Il dit de mettre ces commandes dans la configuration .bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

La première commande change le .history mode fichier à ajouter. Et le deuxième configure le history -a commande à exécuter à chaque invite du shell. le -a écrit immédiatement les lignes actuelles / nouvelles dans le fichier historique.

Relatif à zsh:


70
2017-10-16 04:29



bien ce genre de travaux. J'ai essayé d'autres tests et il semble que cela ne fonctionne que sur la première commande. ça marche correctement pour vous? - Matt


Essayez de mettre cela dans votre .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Crédit ici: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -c efface l'historique de la session en cours. Cela réduira le compteur d'historique par la quantité de $HISTSIZE. history -r lire le contenu de $HISTFILE et insérez-les dans l'historique de la session en cours d'exécution. Cela augmentera le compteur d'historique par la quantité de lignes dans $HISTFILE.

Je pense que cela signifie que les commandes sont disponibles presque immédiatement (vous avez un terminal, écrivez echo 1, deuxième terminal echo 2, premier echo 3 et en appuyant sur la flèche deux fois, vous devriez avoir echo 2 disponible. Vous devez émettre une commande dans un terminal donné pour avoir accès à ce qui a été écrit.


50
2018-03-24 12:56



Brillant! Merci. Je me demande pourquoi ces options ne sont pas documentées dans man history... - artfulrobot
@artfulrobot: Cette commande est un bash intégré de sorte qu'il est décrit dans man bash. Vous pouvez aussi utiliser help history. - pabouk
J'ai mon zsh configuré pour fonctionner comme ceci: Chaque shell suit son historique (et avant cela, l'historique combiné), et chaque commande est ajoutée à l'historique combiné. C'est différent et meilleur que de toujours recharger l'historique pour chaque commande pour chaque shell, car j'ai tendance à avoir un "thread of work" ou un "job" différent pour chaque terminal shell. Je pense que c'est la différence entre cela avec -r et -c vs juste avoir -a. - Steven Lu
Alors, que utilisez-vous exactement? history -c; history -r? Je suppose que c'est mieux pour vous, ce serait mieux pour moi que parfois, j'utilise souvent plusieurs obus pour faire un travail, alors je préfère avoir l'histoire autant combinée que possible. Je pense que cette commande est écrite dans l’histoire uniquement En général, lorsque je lance une session ssh sur un hôte et que je souhaite en ouvrir un autre alors que le premier est toujours en cours d'exécution, je dois le ressaisir car il n'a pas encore été écrit dans l'historique. - sup
Je pense que je ne suis jamais resté assez longtemps pour comprendre comment faire simultanément des traces parallèles de l'historique avec bash (par instance de shell) tandis que écrire immédiatement l'historique dans le fichier historique principal. Zsh facilite la tâche, et en plus j'ai défini une fonction zsh pour écrire beaucoup de métadonnées histoire améliorée fichier de ma conception. C'est devenu plutôt indispensable. Quoi qu’il en soit, les mécanismes precmd () et preexec () pour zsh reçoivent des arguments décrivant la commande saisie. Il devient alors trivial d'orienter cela vers des fichiers. history -a pourrait suffire - Steven Lu


J'ai un fichier historique volumineux avec environ 100 000 entrées et les variantes qui effacent la liste de l'historique et lisent le fichier historique complet (en utilisant history -c et history -r) introduire un délai perceptible (peut-être 0,2 seconde) avant l’affichage de l’invite. En utilisant history -n de sorte que seules les nouvelles lignes lues dans le fichier historique sont plus rapides:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND ne doit pas être exporté car il s'agit d'une variable shell.


30
2017-09-12 12:23



Brillant! Plus d'histoire perdue lorsque la connexion est abandonnée! - Tobia
C'est merveilleux. En ajoutant au fichier et en lisant un fichier, il partagera l’historique sur plusieurs terminaux. - wisbucky


Une note pour toutes les autres réponses (qui sont fondamentalement la même chose):

Réglage PROMPT_COMMAND="history -a;$PROMPT_COMMAND" dans le .bashrc (ou amis) est suffisant.

En outre, vous pouvez exécuter manuellement history -a chaque fois que vous voulez "photographier" l'historique de la session en cours.

La commande shopt -s histappend n'est pas nécessaire car history -a ajoute toujours de nouvelles lignes au fichier et ne les écrase jamais. Aussi, au moins à partir de Bash 4, histappend est le comportement par défaut.


2
2017-07-04 10:22



Sur mon mac 10.13.6 il semblait que cela ne fonctionnait pas sans le shopt -s histappend. Notez aussi que je l'ai ajouté à mon ~/.bash_profile - ubershmekel
Il y a probablement un autre paramètre quelque part dans votre système qui est désactivé histappend, comme c'est le comportement par défaut. Je le chercherais, mais je n'ai pas accès à un Mac. - Guss