GNU/Linux >> Tutoriels Linux >  >> Linux

Historique de Bash :« ignoredups » et « Erasedups » Paramètre un conflit avec l'historique commun à travers les sessions ?

Tout d'abord, il ne s'agit pas d'un doublon d'un thread existant sur SE. J'ai lu ces deux fils (1er, 2e) sur un meilleur historique de bash, mais aucune des réponses ne fonctionne - - Je suis sur Fedora 15 au fait.

J'ai ajouté ce qui suit au .bashrc fichier dans le répertoire utilisateur (/home/aahan/), et cela ne fonctionne pas. Quelqu'un a une idée ?

HISTCONTROL=ignoredups:erasedups  # no duplicate entries
HISTSIZE=1000                     # custom history size
HISTFILESIZE=100000                 # custom history file size
shopt -s histappend                      # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"  # Save and reload the history after each command finishes

D'accord, c'est ce que je veux avec l'historique bash (priorité):

  • ne stockez pas de doublons, effacez ceux qui existent déjà
  • partager immédiatement l'historique avec tous les terminaux ouverts
  • ajoutez toujours l'historique, ne l'écrasez pas
  • stocker les commandes multilignes en une seule commande (qui est désactivée par défaut)
  • Quelle est la taille par défaut de l'historique et la taille du fichier d'historique ?

Réponse acceptée :

C'est en fait un comportement vraiment intéressant et j'avoue avoir largement sous-estimé la question au début. Mais d'abord les faits :

1. Ce qui fonctionne

La fonctionnalité peut être obtenue de plusieurs manières, bien que chacune fonctionne un peu différemment. Notez que, dans chaque cas, pour que l'historique soit "transféré" vers un autre terminal (mis à jour), il faut appuyer sur Entrée dans le terminal, où il souhaite récupérer l'historique.

  • option 1 :

     shopt -s histappend
     HISTCONTROL=ignoredups
     PROMPT_COMMAND="history -a; history -n; $PROMPT_COMMAND"
    

Cela a deux inconvénients :

  1. Lors de la connexion (ouverture d'un terminal), la dernière commande du fichier d'historique est lue deux fois dans le tampon d'historique du terminal actuel ;
  2. Les tampons des différents terminaux ne restent pas synchronisés avec le fichier d'historique.
  • option 2 :

     HISTCONTROL=ignoredups
     PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
    

(Oui, pas besoin de shopt -s histappend et oui, il doit être history -c au milieu de PROMPT_COMMAND )
Cette version présente également deux inconvénients importants :

  1. Le fichier d'historique doit être initialisé. Il doit contenir au moins une ligne non vide (peut être n'importe quoi).
  2. L'history la commande peut donner une fausse sortie - voir ci-dessous.

[Modifier] "Et le gagnant est…"

  • option 3 :

     HISTCONTROL=ignoredups:erasedups
     shopt -s histappend
     PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"
    

C'est aussi loin qu'il obtient. C'est le seul option pour avoir les deux erasedups et l'histoire commune travaillant simultanément. Ceci est probablement la solution finale à tous tes problèmes, Aahan.

2. Pourquoi l'option 2 ne semble pas fonctionner (ou :qu'est-ce vraiment ne fonctionne pas comme prévu) ?

Comme je l'ai mentionné, chacune des solutions ci-dessus fonctionne différemment. Mais l'interprétation la plus trompeuse du fonctionnement des paramètres provient de l'analyse de la sortie de history commande . Dans de nombreux cas, la commande peut donner faux production. Pourquoi? Parce que il est exécuté avant la séquence des autres history commandes contenues dans la PROMPT_COMMAND ! Cependant, lors de l'utilisation de la deuxième ou de la troisième option, on peut surveiller les changements de .bash_history contenu (en utilisant watch -n1 "tail -n20 .bash_history" par exemple) et voir quelle est la véritable histoire.

En relation :Pourquoi la tension de sortie d'un générateur de signaux change-t-elle avec son réglage de fréquence ?

3. Pourquoi option 3 est si compliqué ?

Tout réside dans la façon dont erasedups œuvres. Comme l'indique le manuel bash, "(…) erasedups entraîne la suppression de toutes les lignes précédentes correspondant à la ligne actuelle de la liste d'historique avant que cette ligne ne soit enregistrée" . C'est donc vraiment ce que l'OP voulait (et pas seulement, comme je le pensais auparavant, qu'aucun doublon n'apparaisse en séquence ) . Voici pourquoi chacun des history -. les commandes doivent ou ne peuvent pas être dans le PROMPT_COMMAND :

  • history -n a être là avant history -w à lire depuis .bash_history les commandes enregistrées depuis n'importe quel autre terminal,

  • history -w a être là pour enregistrer le nouvel historique dans le fichier après que bash ait vérifié si la commande était un doublon,

  • history -a ne doit pas être placé là à la place de history -w , car il ajoutera au fichier toute nouvelle commande, qu'elle ait été vérifiée ou non comme doublon.

  • history -c est également nécessaire car cela évite de vider le tampon de l'historique après chaque commande,

  • et enfin, history -r est nécessaire pour restaurer le tampon d'historique à partir du fichier, rendant ainsi finalement l'historique partagé entre les sessions du terminal.

Sachez que cette solution perturbera l'ordre de l'historique en plaçant tout l'historique des autres terminaux devant la dernière commande entrée dans le terminal actuel. Il ne supprime pas non plus les lignes en double déjà présentes dans le fichier d'historique à moins que vous ne saisissiez à nouveau cette commande.


Linux
  1. Comment capturer les sessions de terminal et la sortie avec la commande de script Linux

  2. rechercher et copier un fichier à l'aide de Bash

  3. En utilisant l'historique bash pour obtenir une commande précédente, copiez-la, puis "exécutez-la", mais avec la commande commentée

  4. texte d'écho avec une nouvelle ligne dans bash

  5. Comment puis-je conserver mon historique bash d'une session à l'autre ?

Améliorez votre historique de shell avec Loki et fzf

Commande Linux Zip et Unzip avec exemples

Comment sauvegarder et restaurer l'historique du terminal Linux

La redirection bash expliquée avec des exemples

Comment effacer l'historique de Bash sous Linux et Mac

Qu'est-ce que <() dans bash (et =() dans zsh) ?