Como acessar o segundo argumento do último comando na história?

11

Estou começando a aprender algum Regex, portanto, uso este comando repetidamente:

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

Somente a parte com o padrão muda, então tenho que escrever a expressão longa " / usr / share / dict / american-english " repetidamente.

Alguém fez a observação de que é possível expandir um argumento de um comando a partir do histórico de comandos digitando combinações de caracteres enigmáticos em vez da expressão completa. Você poderia me dizer essas combinações de caracteres enigmáticas?

Abdul Al Hazred
fonte
É sobre o segundo argumento ou o último argumento?
mikeserv
neste mesmo caso, o último argumento passa a ser o segundo, não esclareci essa distinção.
Abdul Al Hazred
Nesse caso, o bash, dash, zsh, mksh, e kshconchas (pelo menos, que eu saiba) tudo vai reconhecer o $_parâmetro especial última arg (alguns fazê-lo apenas no modo interativo, embora) . Ele só se expande como uma variável: grep somepattern filename; grep otherpattern "$_". Você geralmente pode ver seu conteúdo na saída de set.
mikeserv

Respostas:

23

Você pode usar <M-.>(ou <Esc>.se sua tecla Meta estiver sendo usada para outra coisa), ou seja, Meta-ponto (ou <esc> ponto), em que Meta é geralmente a tecla Alt, para recuperar o último argumento do comando anterior. Então, primeiro você digitaria

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

E então, se você deseja grep para outra coisa, digite

$ grep bar

Depois de digitar um espaço e depois Esc.(ou seja, primeiro pressione a tecla Esc, e depois a tecla de ponto):

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

Você também pode usar um dos seguintes:

$ grep bar !:2
$ grep bar !$

Onde !:2e !$significa "segundo argumento" e "último argumento", respectivamente.

Maçaneta
fonte
Isto é para bash e conchas que o uso readline usando emacs ligações (padrão): com editing-mode viset você precisa adicionar uma ligação a ~/.inputrcde yank-last-arge para Zsh você precisa vincular insert-last-word...
jasonwryan
@jasonwryan, se é o último arg você quer, então em qualquer um (interativo) zsh , bash, ksh, mksh, ou dashconchas você pode apenas usar $_. POSITIVAMENTE, que a ligação já esteja configurada para ESC _quando set -o viestiver em vigor.
mikeserv
@mikeserv Graças Mike, preciso recuperar-lo para compatibilidade ...
jasonwryan
@jasonwryan - não há problema - esse é o único truque de teclado que eu conheço - eu sou péssimo em lembrar / configurar todos esses atalhos de tipo rápido. Se você não se importa, compatibilidade com o quê? Existe algum programa que você usa que faz diferente? Ah, também me lembro da letra ESC @ para a _letterligação de alias - mas apenas porque ainda não consigo descobrir como fazê-la funcionar com bsd editline.
mikeserv
@mikeserv Eu o vinculo dessa maneira para que seja o mesmo, independentemente de eu estar usando o Bash ou o Zsh (ambos no modo vi) ou em uma máquina com o Bash no modo Emacs (é uma das ligações que eu realmente martelo).
precisa saber é o seguinte
2

Em geral (com Bash) <Esc> N <Esc> ., o N'th é o argumento do comando anterior para a linha de comando atual (onde N é baseado em 0).

Para o segundo argumento do último comando, seria:

<Esc> 1 <Esc> .

Se você queria o terceiro argumento, então

<Esc> 2 <Esc> .

... e assim por diante.

Como outros já mencionaram, se você deseja o último argumento do comando anterior, há um atalho específico para isso em apenas:

<Esc> .

abonet
fonte