Comment accéder au deuxième argument à partir de la dernière commande de l'historique?

11

Je commence à apprendre quelques Regex, donc j'utilise cette commande à plusieurs reprises:

grep pattern /usr/share/dict/american-english 

Seule la partie avec le modèle change, donc je dois écrire encore et encore l'expression longue " / usr / share / dict / american-english ".

Quelqu'un a fait remarquer qu'il est possible de développer un argument d'une commande à partir de l'historique des commandes en tapant des combinaisons de caractères cryptiques au lieu de l'expression complète. Pourriez-vous me dire ces combinaisons de caractères cryptiques?

Abdul Al Hazred
la source
S'agit-il du deuxième argument ou du dernier argument?
mikeserv
dans ce cas précis, le dernier argument se trouve être le deuxième, je n'ai pas précisé cette distinction.
Abdul Al Hazred du
Dans ce cas, le bash, dash, zsh, mkshet kshcoquilles (au moins, que je sais) reconnaîtrons tous le $_dernier paramètre spécial arg (certains le font uniquement en mode interactif, cependant) . Il se développe comme une variable: grep somepattern filename; grep otherpattern "$_". Vous pouvez généralement voir son contenu dans la sortie de set.
mikeserv

Réponses:

23

Vous pouvez utiliser <M-.>(ou <Esc>.si votre touche Meta est utilisée pour autre chose), c'est-à-dire Meta-dot (ou <esc> dot), où Meta est généralement la touche Alt, pour rappeler le dernier argument de la commande précédente. Donc, vous devez d'abord taper

$ grep foo /usr/share/dict/american-english

Et puis si vous vouliez chercher autre chose, vous taperiez

$ grep bar

Après avoir tapé un espace puis Esc.(c'est-à-dire en appuyant d'abord sur la touche d'échappement, puis sur la touche point):

$ grep bar /usr/share/dict/american-english

Vous pouvez également utiliser l'une des options suivantes:

$ grep bar !:2
$ grep bar !$

!:2et !$signifient respectivement "deuxième argument" et "dernier argument".

Poignée de porte
la source
C'est pour bash et les shells qui utilisent readline en utilisant des liaisons emacs (par défaut): avec editing-mode viset vous devez ajouter une liaison pour ~/.inputrcfor yank-last-arget pour Zsh vous devez lier insert-last-word...
jasonwryan
@jasonwryan, si elle est la dernière arg que vous voulez, puis dans l' un des (interactif) zsh , bash, ksh, mkshou dashcoquilles vous pouvez simplement utiliser $_. POSIXLY que la liaison est déjà définie, cependant, ESC _quand set -o viest en vigueur.
mikeserv
@mikeserv Merci Mike, je dois l'avoir rebondi pour la compatibilité ...
jasonwryan
@jasonwryan - pas de problème - il se trouve que c'est le seul truc de clavier shell que je connaisse - je crains de me souvenir / configurer tous ces raccourcis de type rapide. Si cela ne vous dérange pas, la compatibilité w / quoi? Y a-t-il un programme que vous utilisez qui le fait différemment? Oh, je me souviens aussi de ESC @letter pour la _letterliaison d'alias - mais seulement parce que je ne sais toujours pas comment le faire fonctionner avec bsd editline.
mikeserv
@mikeserv Je le lie de cette façon pour qu'il en soit de même, que j'utilise Bash ou Zsh (les deux en mode vi) ou sur une machine avec Bash en mode Emacs (c'est l'une des liaisons que je martèle vraiment).
jasonwryan
2

En général (avec Bash) <Esc> N <Esc> .rappellera l'argument N'th de la commande précédente dans la ligne de commande actuelle (où N est basé sur 0).

Pour le deuxième argument de la dernière commande, ce serait:

<Esc> 1 <Esc> .

Si vous vouliez le troisième argument, alors

<Esc> 2 <Esc> .

... etc.

Comme d'autres l'ont mentionné, si vous voulez le dernier argument de la commande précédente, il y a un raccourci spécifique pour cela juste:

<Esc> .

abonet
la source