Désactiver les éléments répétés dans l'historique bash


1

Bash dans Fedora 19 m’énerve vraiment. Dites que je lance une commande:

echo "Hello"

Puis je lance une autre commande:

echo "World"

Maintenant, je lance à nouveau la dernière commande ( echo "World") à nouveau N fois en appuyant upsur la touche de mon clavier, suivie de la touche Entrée. (Utilisation typique.)

Le problème est que chacune de ces echo "World"commandes est insérée dans l'historique, même si elles sont identiques. Je veux simplement appuyer updeux fois et arriver à echo "Hello". Au lieu de cela, je dois appuyer sur upN + 1 fois.

Pourquoi est-ce cassé? Comment je le répare?


Ce n'est pas cassé - chaque commande est entrée dans l'histoire.
suspect

Réponses:


2

Enregistrer uniformément chaque nouvelle commande est délicat. Tout d'abord, vous devez ajouter ~/.profileou similaire:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Ensuite, vous devez ajouter à ~/.bash_logout:

history -a
history -w

S'il vous plaît, ne postez pas la même réponse à plusieurs questions. Si la même information répond vraiment aux deux questions, alors une question (généralement la plus récente) doit être fermée comme une copie de l’autre. Vous pouvez indiquer cela en votant en faveur de la fermeture en double ou, si votre réputation n'est pas suffisante, de lever un drapeau pour indiquer qu'il s'agit d'une copie. Sinon, adaptez votre réponse à cette question et ne collez pas la même réponse à plusieurs endroits.
DavidPostill

1

Je ne sais pas comment résoudre ce problème, mais je vais vous proposer une solution de loin, de loin meilleure. Faites-le avec "Ctrl + r echo" et parcourez vos versions dactylographiées avec "Ctrl + r" C'est plus rapide et quand vous aurez l'astuce, vous allez l'adorer.

Exemple

Ctrl + r echo

the promt show: "echo World", si ce n’est pas ce que vous voulez, appuyez encore une fois sur Ctrl + r

le message suivant: "echo hello", si ce n’est pas ce que vous voulez, appuyez sur Ctrl + r. Si c'est ce que vous voulez, appuyez simplement sur Entrée.

Et vous n'avez pas besoin de commencer votre mot dans l'ordre, vous pouvez faire:

Ctrl + r Monde

et l'invite affichera "echo World" et vous pourrez appuyer sur Entrée pour l'exécuter.

Si facile.


1

Ceci est 'cassé' car chaque commande est entrée dans l'historique par défaut, comme l'a souligné @suspectus.

Vous pouvez toutefois demander à Bash d'effacer les doublons en définissant la variable Bash HISTCONTROL. (Documentation: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables ). Il s’agit d’une liste de zéro ou plusieurs mots-clés séparés par des deux-points, celle qui vous intéresse le plus erasedups. Notez que seul l'historique saisi dans les sessions en cours est affecté. Le réglage HISTCONTROL=erasedupsne reviendra pas et n'effacera pas les doublons de vos sessions précédentes (mais regardez ci-dessous pour une autre solution). Notez également qu'il HISTCONTROLs'agit d'une variable Bash et qu'il n'est pas nécessaire de l'exporter.

Pour ce que ça vaut, mes réglages sont:

HISTCONTROL=ignoreboth:erasedups
HISTIGNORE="?:??:???:$HISTIGNORE"
HISTSIZE=5000

J'ai commencé à utiliser ces paramètres parce que de nombreuses commandes triviales et en double m'énervaient en poussant les commandes soigneusement conçues hors de la liste. Le HISTIGNOREparamètre ignore les commandes courtes. Je trouve que ce n'est pas beaucoup plus rapide de taper 'Flèche haut' pour récupérer une commande ls, par exemple, je préfère donc ne pas stocker de commandes du tout à une lettre. En outre, tout ce qui commence par un espace ne sera pas stocké dans l'historique. J'utilise ceci pour les commandes à jeter.

Notez que les doublons peuvent encore s'accumuler si plusieurs sessions sont ouvertes en même temps. De temps en temps, je supprime les doublons du fichier d'historique avec la ligne suivante:

tac ~/.bash_history | awk '!seen[$0]++' | tac > .tmp.newhist && mv .tmp.newhist ~/.bash_history

0

L'historique Bash ne peut pas distinguer les commandes dupliquées. Toutes les commandes sont enregistrées dans l'historique. Une façon d'obtenir rapidement la commande requise consiste à:

set -o vi

tapez ESC, puis /hello vous donnera la commande la plus récente avec la chaîne "hello". Utilisez la flèche vers le haut pour répertorier les commandes précédentes correspondant à la chaîne "hello". D'autres commandes vi peuvent être utilisées pour récupérer / naviguer dans les commandes.

Si utile, set -o vipeut être ajouté à .bashrc dans votre HOMErépertoire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.