Как получить доступ ко второму аргументу из последней команды в истории?

11

Я начинаю изучать некоторые Regex, поэтому я использую эту команду несколько раз:

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

Изменяется только часть с шаблоном, поэтому мне приходится снова и снова писать длинное выражение " / usr / share / dict / american-english ".

Кто-то сделал замечание, что можно расширить аргумент команды из истории команд, введя загадочные комбинации символов вместо полного выражения. Не могли бы вы рассказать мне эти загадочные комбинации символов?

Абдул Аль Хазред
источник
Это второй аргумент или последний аргумент?
mikeserv
в этом самом случае последний аргумент оказывается вторым, я не прояснил это различие.
Абдул Аль Хазред
В этом случае bash, dash, zsh, mksh, и kshснаряды (по крайней мере, что я знаю о) будет все признают $_последний ARG специальный параметр (некоторые делают это только в интерактивном режиме, хотя) . Это просто расширяется как переменная: grep somepattern filename; grep otherpattern "$_". Обычно вы можете увидеть его содержимое в выводе set.
mikeserv

Ответы:

23

Вы можете использовать <M-.>(или <Esc>.если ваш Meta-ключ используется для чего-то еще), то есть Meta-dot (или <esc> dot), где Meta обычно является клавишей Alt, чтобы вызвать последний аргумент предыдущей команды. Итак, сначала вы наберете

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

И затем, если вы хотите использовать grep для чего-то другого, вы наберете

$ grep bar

После ввода пробела и затем Esc.(т. Е. Сначала нажмите клавишу выхода, а затем клавишу точки):

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

Вы также можете использовать любой из следующих:

$ grep bar !:2
$ grep bar !$

Где !:2и !$означают «второй аргумент» и «последний аргумент» соответственно.

Дверная ручка
источник
Это для bash и оболочек, которые используют readline с использованием привязок emacs (по умолчанию): с помощью editing-mode viset вам нужно добавить привязку для ~/.inputrcfor, yank-last-argа для Zsh - bind insert-last-word...
jasonwryan
@jasonwryan, если это последний аргумент вы хотите, то в любом из (интерактивный) zsh , bash, ksh, mksh, или dashоболочек вы можете просто использовать $_. ТОЛЬКО это связывание уже установлено, хотя, ESC _когда set -o viдействует.
mikeserv
@mikeserv Спасибо, Майк, я должен отскочить для совместимости ...
jasonwryan
@jasonwryan - нет проблем - это просто единственный трюк с клавиатурой, который я знаю - мне не хватает памяти и настройки всех этих быстрых клавиш. Если не возражаете, совместимость с чем? Есть ли какая-то программа, которую вы используете, которая делает это по-другому? О, я также могу вспомнить ESC @letter для _letterсвязывания псевдонимов - но только потому, что я до сих пор не могу понять, как заставить его работать с bsd editline.
mikeserv
@mikeserv Я связываю его таким образом, чтобы он был одинаковым, независимо от того, использую ли я Bash или Zsh (оба в режиме vi) или на машине с Bash в режиме Emacs (это одно из назначений, которое я действительно выбиваю).
Джейсонвриан
2

В общем случае (с помощью Bash) <Esc> N <Esc> .вызовет N-й аргумент из предыдущей команды в текущей командной строке (где N - это 0).

Для второго аргумента из последней команды это будет:

<Esc> 1 <Esc> .

Если вы хотели третий аргумент, то

<Esc> 2 <Esc> .

... и так далее.

Как уже упоминали другие, если вы хотите последний аргумент из предыдущей команды, есть специальный ярлык для этого просто:

<Esc> .

abonet
источник