Dans les systèmes UNIX, vous pouvez appuyer sur les flèches haut et bas pour parcourir les commandes précédentes. C'est extrêmement pratique.
Parfois, je monte et trouve une commande que je veux réutiliser, mais avec quelques variantes. Si j'effectue de telles modifications, je n'ai aucun moyen de récupérer la commande d'origine, sauf si je l'enregistre history
.
Existe-t-il un moyen d'annuler les modifications de la commande dans l'historique accessible via les touches?
Ma solution de contournement actuelle consiste à ajouter un préfixe #
à la commande. De cette façon, la commande actuelle est exécutée en tant que commentaire, donc rien ne se passe. Ensuite, je peux à nouveau parcourir les commandes avec les touches. Le problème est que la commande que j'utilisais peut être très éloignée de la liste, donc remonter 200 fois c'est un peu. Control + R n'est pas non plus une solution, car je ne me souviens peut-être pas exactement de ce que je cherchais.
Exemple
J'ai tapé "il y a 50 commandes":
ls -l /etc/httpd/conf/
Maintenant, je suis allé jusqu'à cette ligne et l'ai changé en
ls -l /etc/init.d/
mais n'a pas appuyé sur Entrée. Maintenant, je veux revenir au ls -l /etc/httpd/conf/
.
Mon environnement
$ echo $SHELL
/bin/bash
$ echo $TERM
xterm
la source
ksh
, par exemple, vous pouvez modifier les entrées d'historique et les appeler sans supprimer la "version précédente" de l'entrée; vous avez toutes les commandes appelées disponibles.ksh
le comportement de diffère ici, semble-t-il. Et vos options de modification d'historique dépendent également du mode d'édition choisi. Dansksh
le vi-mode de, par exemple, l'ancienne entrée n'est pas écrasée, et je peux également émettre une commande d'annulation, comme dansvi
, avec 'u'.ksh
, mais il est bon de savoir qu'une telle chose existe là-bas.Réponses:
Tant que vous avez modifié une entrée d'historique mais que vous n'avez pas Enterencore appuyé , pour revenir à l'entrée d'origine, appuyez plusieurs fois sur Ctrl+ _- la
undo
commande - jusqu'à ce qu'elle ne fasse plus de changement. Vous revenez à l'entrée d'origine.la source
Revenez à la commande d'origine lorsque vous avez apporté plusieurs modifications à la ligne:
M
est la méta clé, qui est altrpour moi.Informations gratuites mais utiles
Lorsque vous avez exécuté une commande comme OP l'avait fait précédemment (cela arrive), il n'y a rien à "annuler" car les commandes sont gérées et mémorisées par la bibliothèque GNU Readline et ne
$HISTFILE
sont écrites que lorsque le shell se termine. La raison pour laquelle je mentionne cela parce que vous ne pouvez pasgrep
l'$HISTFILE
comme on pouvait s'y attendre et il ne peut pas être idéal pour sortir de la coquille.Voici donc quelques options pour vous éviter de faire défiler toutes les commandes de lecture précédentes.
Si vous vous souvenez d'une partie de la commande , appuyez sur ctrl+ ret tapez ce dont vous vous souvenez pour rechercher dans les commandes précédentes contenant cette chaîne. Appuyez à nouveau sur ctrl+ rpour afficher le suivant le plus récent, en effectuant une recherche vers l'arrière.
Par exemple, tapez
ls -l
puis ctrl+ rautant de fois qu'il le faut pour trouver la commande précédente que vous recherchez. Si vous le faites défiler, ctrl+ srecherchera vers l'avant à partir de la position actuelle.La
fc
commande bash intégrée est utile pour répertorier les numéros d'index aux côtés des commandes readline précédentes.fc -l -100
listera les 100 commandes précédentes en ligne de lecture.De plus, si OP sait qu'il recherche une
ls -l
commande précédente , il peut diriger la sortie versgrep
par exemple:fc -l -100 | grep 'ls -l'
Cela devrait produire une liste des
ls -l
commandes précédentes précédées d'un numéro d'index. La sortie ressemble à ceci:2065 ls -l
Vous pouvez maintenant utiliser l'indicateur d' événement
!n
oùn
est le numéro d'index. Dans cet exemple, l'exécution!2065
s'étendra àls -l
.Bien que cela n'aide pas après coup, quiconque cherche à conserver l'historique des commandes récentes lors de la modification des commandes précédentes devrait voir la
HISTORY EXPANSION
section deman bash
. Voici quelques méthodes alternatives pour modifier les anciennes commandes sans écraser l'historique.La
Event Designators
section montre comment vous pouvez facilement modifier la chaîne à partir de la dernière commande utilisée.Exemple:
Les commandes les plus récentes afficheront désormais:
L'exemple ci-dessus explique également comment utiliser
sed
pour remplacer une chaîne dans un désignateur d'événement.Donc, si 3 commandes apparaissent dans l'historique,
echo foo
vous utiliserez:!-3:s/foo/bar
Notez que les désignateurs d'événements apparaîtront dans votre historique lors de l'exécution de la commande, dans ce cas
echo bar
. Il n'apparaîtra pas dans l'historique comme!-3:s/foo/bar
.Il suffit de jeter cela là-bas car cela semble étroitement lié, même s'il s'agit plus d'un "ne pas faire" que la solution "annuler" qu'OP recherche.
la source