web-dev-qa-db-fra.com

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

J'ouvre souvent plein de terminaux [pour le moment, j'ai 7 ouvert 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 traquer le terminal, puis faites défiler et cherchez plus, 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 avait été tué].

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

122
Matt

Une solution simple comme détaillé 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.

Connexes pour zsh:

89
mario

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"

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 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 par le 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, deuxième terminal echo 2, premier echo 3 et en appuyant deux fois sur la flèche, vous devriez avoir echo 2 disponible. Vous devez émettre une commande dans un terminal donné pour avoir accès à ce qui a été écrit.

54
sup

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 de history -r) introduisent un délai notable (environ 0,2 seconde) avant l'affichage de l'invite. Utiliser history -n pour que seules les nouvelles lignes lues dans l'historique soit plus rapide:

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

Prompt_COMMAND ne doit pas nécessairement être exporté car il s'agit d'une variable Shell.

37
nisetama

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

Il suffit de définir Prompt_COMMAND="history -a;$Prompt_COMMAND" dans .bashrc (ou entre amis).

En outre, 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.

3
Guss