Comment empêcher Bash de modifier l'histoire?

26

Si j'appuie sur les flèches haut ou bas de mon clavier, puis que je modifie quelque chose de mon historique, cela change pour toujours. Même si j'appuie sur Ctrl-C et que j'essaie de le faire apparaître à nouveau, cela a toujours changé - j'ai perdu cette entrée dans mon historique.

Comment puis-je empêcher que cela se produise?

Mehrdad
la source
3
J'adore le titre de cette question. Vous pouvez réellement modifier l'histoire et vous vous plaignez? Qu'est ce qui ne vas pas chez toi?!
Daniel Beck
@Daniel: Lol, ouais ... Je veux dire, c'est comme si je changeais mon passé. Clairement absurde, et cela devient ridiculement ennuyeux après un certain temps. : \
Mehrdad
Btw, si vous utilisez plutôt history-search-xxx , le comportement est différent. C'est peut-être quelque chose pour vous?
Daniel Beck
@Daniel: C'est effectivement utile - merci beaucoup. Mais encore, je voudrais connaître la réponse à cette question, car parfois les commandes ne se ressemblent pas tellement, et cela ne fonctionne pas.
Mehrdad
la recherche d'historique avec une invite vide fonctionne exactement comme l'historique précédent / suivant, c'est-à-dire l'affichage de toutes les entrées.
Daniel Beck

Réponses:

17

Vous voulez le paramètre de ligne de lecture:

set revert-all-at-newline on

Vous pouvez le mettre dans ~/.inputrc(voir note ci - dessous), ou mettre bind 'revert-all-at-newline on'dans votre ~/.bashrc.

Démo:

$ man bash
$ bind 'set revert-all-at-newline on'
$ man bsh # up arrow and edit
No manual entry for bsh
$ man bash # three up arrows

Plus de détails sont dans la page de manuel Bash :

revert-all-at-newline

S'il est défini sur ' on', Readline annulera toutes les modifications apportées aux lignes d'historique avant de revenir lorsque accept-line est exécuté. Par défaut, les lignes d'historique peuvent être modifiées et conserver des listes d'annulation individuelles entre les appels à readline. La valeur par défaut est ' off'.


Remarque:

Si un nouveau ~/.inputrcfichier est créé dans le but de le définir revert-all-at-newline, sachez que bash utilisera les paramètres de ligne de lecture de ce fichier au lieu des paramètres qui peuvent se trouver dans le fichier /etc/inputrc. Autrement dit, tous les paramètres spécifiés dans /etc/inputrcne seront plus en vigueur. Par conséquent, si le /etc/inputrcfichier existe, c'est une bonne idée de commencer ~/.inputrcpar la ligne:

$include /etc/inputrc

sarnold
la source
Tu es génial, c'est exactement ce dont j'ai besoin. Je ne veux plus frapper mon moniteur. : D +1000000 (je souhaite)
Mehrdad
5

J'entre:

ls /tmp

- merveilleux. Maintenant je ne veux pas entrer

ls /temp 

et peut l'empêcher d'entrer dans l'historique, donc l'empêcher d'écraser ls / tmp, si je lance la commande avec un blanc:

 ls /temp

C'est difficile à voir, mais si vous le savez ...

Il est contrôlé par

export HISTCONTROL=ignoredups
export HISTCONTROL=ignoreboth

ignoredups ignore uniquement les commandes dupliquées, ignoreboth ignore les espaces au début de la ligne, ce qui est utile pour masquer les mots de passe non masqués.

Mais peut-être que vous êtes à la recherche d'une solution, où vous vous retrouvez avec les deux commandes, l'ancienne non modifiée et la nouvelle. Ma version de bash ou mes paramètres se comportent comme ceci, mais je ne sais pas ce qui est différent du vôtre.

Utilisateur inconnu
la source
Ha; J'ai toujours supposé que ne pas enregistrer les commandes avec un espace de tête était un bug. Merci. :)
sarnold