Comment rappeler une commande précédente (sans exécution) pour la changer?

14

Je ne me souviens pas de l'astuce où j'ai pu obtenir la dernière commande sans l'exécuter:

disons que je veux pouvoir accéder à la commande! 1255 en appuyant sur la flèche haut et modifier la commande. Alors, quelle est l'astuce pour appeler la commande, la faire apparaître dans la ligne de commande mais pas exécutée et ensuite accessible via la flèche vers le haut?

J'ai essayé de mettre un écho, mais j'ai un écho avant la commande, je ne me souviens pas comment le faire correctement.

Arturas M
la source
4
si je comprends bien votre demande, essayez peut-être un suffixe de ": p" comme dans "! 1255: p"
Theophrastus
@Theophrastus oui, exactement, j'avais oublié ceci: partie p et n'arrivais pas à trouver les bons mots clés dans google pour le trouver ... Merci les gars.
Arturas M

Réponses:

21
!1255:p

Fera ça

!est le rappel de l'historique
1255est le numéro de ligne
:pimprimé mais ne s'exécute pas

Ensuite, vous pouvez utiliser la flèche vers le haut pour récupérer la commande précédente (non exécutée) et vous pouvez la modifier selon vos besoins.

Je combine souvent cela avec hg("History Grep") - mon alias préféré.

$ alias hg  # Maybe use hgr instead if you are a Mercurial CLI user.
alias hg='history | tail -200 | grep -i'

Cela recherche du texte sur une ligne d'historique récente, indépendamment de la casse et est utilisé de cette façon:

Lorsque je souhaite rechercher des commandes vi récentes pour modifier un certain fichier, puis je veux réutiliser l'une d'entre elles pour modifier le même fichier mais avec une extension de fichier différente.

$ hg variables
 6153  vi Variables/user-extensions.js 
 6176  vi Variables/user-extensions.js 
 6178  vi Variables/user-extensions.js 
 6190  vi Variables/user-extensions.js 
 6230  hg variables
$ # Notice the difference in case with V and v is ignored
$ !6190:p
vi Variables/user-extensions.js 
$ ["up-arrow"]
$ vi Variables/user-extensions.[now change .js to .html]

Je définis également hga("History Grep All") pour rechercher toute mon histoire:

$ alias hga
alias hga='history | grep -i'

mais je ne l'utilise pas beaucoup car mon historique est (intentionnellement) très volumineux et j'obtiens trop de sortie qui affecte plus tard le défilement des pages dans mon terminal.

Michael Durrant
la source
2
Notez que hgc'est également la CLI de Mercurial .
usandfriends
1
Bonne note. Ajouté pour répondre.
Michael Durrant
12

Le fait d'appuyer sur Ctrl+ R(qui est la liaison de clé de recherche incrémentielle inversée d'emacs lorsque @gnp s'est déplacé dans les commentaires) dans le terminal vous permet de rechercher dans la mémoire une commande spécifique. La commande s'affiche et peut être modifiée avant d'être exécutée. Vous verrez quelque chose comme ceci:

entrez la description de l'image ici

La source

Hamza Abbad
la source
1
Merci! Pas vraiment la réponse directe à ma question, mais je ne le savais pas et je le trouve vraiment utile. Merci beaucoup!
Arturas M
1
Il convient également de noter que Ctrl + R est la recherche incrémentale inverse d'Emacs. De nombreux raccourcis clavier emacs fonctionnent sur de nombreux outils GNU: Ctrl + A, Ctrl + E, Ctrl + K, Ctrl + Y et autres.
GnP
@gnp Merci pour l'information, je ne le savais pas.
Hamza Abbad
Cela m'a pris beaucoup de temps à l'aise avec ctrl-r après avoir appris deux choses clés. 1. ignorez la sortie pendant que vous tapez. 2. Assurez-vous que vous en savez assez pour taper assez uniquement pour la commande que vous voulez
Michael Durrant
7

la fccommande fait ce que vous voulez

fc -l <number> listera l'historique des commandes autour de ce nombre

fc <number>ouvrira cette entrée de ligne de commande dans vim(ou quel que soit votre éditeur par défaut, je suppose), afin que vous puissiez le modifier, et sur :wqcelui-ci sera disponible pour vous avec la flèche vers le haut.

Sauce
la source
7

Dans bash Ctl+alt+e, l'expansion du shell, donc en tapant !1255puis en appuyant sur cette combinaison remplacera la ligne actuelle par le contenu de l'entrée d'historique 1255

Adonis
la source
n'a pas fait ça pour moi sur Ubuntu
Michael Durrant
@MichaelDurrant, je viens d'essayer le 14.04 (kubuntu) et ça marche pour moi. Il est documenté en man bashtant que shell-expand-line. Il existe peut-être un raccourci pour gnome-terminal.
adonis
@adonis Je n'ai jamais connu celui-ci, merci beaucoup, en effet il fait aussi ce que je demandais. Et en effet, je peux trouver plus d'utilisations de cette fonction. Impressionnant! Merci!
Arturas M
4

Vous souhaitez utiliser la commande fc tout en spécifiant list au lieu d'exécuter (-l)

fc -ln -1
Miaou
la source