Existe-t-il un moyen d'annuler une modification de l'historique de bash?

9

En appuyant vers le haut, je peux parcourir les commandes entrées précédemment. J'ai remarqué cependant que si j'en modifie un, cela modifie l'histoire. Par exemple, si je tape:

echo a
echo b
echo c
[up][up][backspace]d[ctrl+c]

l'histoire montre maintenant que la deuxième commande ne l'était echo dpas echo b. Comment garder le premier echo bde l'histoire?

Par exemple, disons que j'exécute une commande très longue, avec beaucoup d'options. puis je veux l'exécuter à nouveau, avec un changement mineur, donc je reviens à travers l'histoire pour le trouver, faire le changement, mais je me rends compte qu'en fait je n'ai pas besoin de le réexécuter, après avoir juste pensé à une autre option à faire à la place. puis plus tard, je veux revenir en arrière et me rappeler quelle était la commande que j'ai exécutée - mais attendez, l'histoire montre maintenant la mauvaise chose!

Cela revient très rarement, mais quand ça arrive, je trouve ça vraiment irritant. Existe-t-il un moyen de conserver automatiquement l'historique d'origine?

Benubird
la source
1
avec historyvous pouvez voir toute la commande. Après vous pouvez sélectionner ce dont vous avez besoin. Quel shell utilisez-vous maintenant?
Hastur
6
Je ne peux pas reproduire ça. Si je change c en d, appuyez sur CTRL + C et appuyez à nouveau sur [haut], dit-il toujours echo c.
Martin von Wittich

Réponses:

6

Essayez de mettre votre ~/.inputrc

 set revert-all-at-newline on

Dans certains cas, vous pouvez le trouver dans la valeur par défaut (Off).
Il devrait forcer readlineà annuler toutes les modifications apportées aux lignes d'historique avant de retourner lorsqu'il accept-lineest exécuté. (plus d'informations dans man bash).

Edit:
CTRL+c et set revert-all-at-newline onfonctionne très bien depuis bash-4.3.30.

# GNU bash, version 4.3.30(1)-release
# Emacs-mode

echo c
[up][backspace]d[Ctrl+c][up] # you should see echo c

Mais:

echo c
[up][backspace]d[down][Ctrl+r]echo[Ctrl+j][Ctrl+c][up] # you should see echo d
Hastur
la source
Bien, c'est la meilleure solution. Fait intéressant, CTRL-c lui fera en fait se souvenir de la valeur modifiée, bien que l'effacement complet de la ligne ou la flèche vers le bas, puis en appuyant sur Entrée ou en exécutant une autre commande restaurera l'historique.
Dean Serenevy
@DeanSerenevy: Merci, j'aime aussi votre solution de contournement et je commence à utiliser CTRL-a nanoaussi :-)
Hastur
4

Habituellement:

CTRL-a # ENTER

le fera.

La commande d'origine sera mémorisée si vous exécutez la commande modifiée. Bien sûr, vous ne voulez pas réellement exécuter, vous pouvez donc commenter la ligne avec #.

Dans votre exemple, vous auriez alors dans votre histoire: echo a, echo b, echo c, # echo d.

Dean Serenevy
la source
1
Vous pouvez appuyer sur alt-shift-3pour mettre en commentaire la ligne de commande actuelle si votre bash utilise readline. /insert-commentdans man 3 readline(ou man bash) pour plus d'informations.
cychoi