Est-il possible d'écrire immédiatement dans .bash_history?

108

J'ouvre souvent plein de terminaux [actuellement, j'ai 7 ouvertures sur cet espace de travail] et je cherche souvent history avec grep pour trouver une commande que je viens d'écrire récemment, mais je ne veux pas pour traquer le terminal, puis faire défiler et le rechercher davantage, etc. Parfois, mes terminaux se ferment sans «sortie» et tout ce que j'ai écrit est perdu [Parfois, j'avais besoin de quelque chose que j'avais écrit dans un terminal qui a été tué].

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

    
posée Matt 16.10.2011 - 05:09
la source

4 réponses

78

Une solution simple, telle que détaillée dans Mettre à jour l'historique Bash en temps réel .

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

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

La première commande modifie le mode de fichier .history à ajouter. Et le second configure la commande history -a à exécuter à chaque invite du shell. Le -a écrit immédiatement les lignes actuelles / nouvelles dans le fichier d’historique.

En relation avec zsh:

réponse donnée mario 16.10.2011 - 06:29
la source
52

Essayez de mettre ceci dans votre .bashrc :

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

Inscrivez-vous ici: lien

history -c efface l'historique de la session en cours. Cela réduira le compteur d'historique du montant de $HISTSIZE . history -r lit le contenu de $HISTFILE et les insère dans l'historique de la session en cours. Cela augmentera le compteur d'historique du nombre de lignes dans $HISTFILE .

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

    
réponse donnée sup 24.03.2012 - 13:56
la source
32

J'ai un fichier d'historique volumineux contenant environ 100 000 entrées et les variantes qui effacent la liste d'historique et lisent l'intégralité du fichier d'historique (à l'aide de history -c et history -r ) introduisent un délai notable (environ 0,2 seconde) avant l'invite. est affiché. Utiliser history -n pour que seules les nouvelles lignes lues à partir du fichier d’historique soit plus rapide:

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

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

    
réponse donnée user4669748 12.09.2015 - 14:23
la source
3

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

Définir PROMPT_COMMAND="history -a;$PROMPT_COMMAND" dans le .bashrc (ou entre amis) suffit.

De plus, vous pouvez exécuter manuellement history -a chaque fois que vous souhaitez "capturer" 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 l'écrase jamais. De plus, au moins à partir de Bash 4, histappend est le comportement par défaut.

    
réponse donnée Guss 04.07.2018 - 12:22
la source

Lire d'autres questions sur les étiquettes