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 :
- 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 ;
- 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 :
- Le fichier d'historique doit être initialisé. Il doit contenir au moins une ligne non vide (peut être n'importe quoi).
- 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.
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à avanthistory -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 dehistory -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.