Como posso recuperar o argumento do comando bash anterior?

312

Existe uma maneira no Bash de recuperar o argumento do comando anterior?

Eu costumo fazer vi file.cseguido por gcc file.c.

Existe uma maneira no Bash de recuperar o argumento do comando anterior?

O codificador
fonte
2
Possível duplicata: stackoverflow.com/questions/4009412/…
eugenevd

Respostas:

562

Você pode usar $_ou !$para recuperar o último argumento do comando anterior.

Também Alt + .pode ser usado para recuperar o último argumento de qualquer um dos comandos anteriores.

codaddict
fonte
121
Além disso, se você quer um argumento arbitrária, você pode usar !!:1, !!:2etc. ( !!:0é o próprio comando anterior.) Veja gnu.org/software/bash/manual/bashref.html#History-Interaction
janmoesen
41
Semelhante a !$, você usa !^para o primeiro argumento.
Will
13
ahh ... * nix ... você é uma coisa de beleza ... todo dia eu te amo mais
jx12345
Como podemos nos referir ao penúltimo argumento do comando anterior? por exemplo, se eu dei echo tiger rabbit, como posso me referir tigerno seguinte comando?
Chan Kim
3
Alt + .não funciona no modo vi. Apenas para sua informação, para outros que estavam confusos aqui.
Brian McCutchon
160

Se o comando anterior tiver dois argumentos, como este

ls a.txt b.txt

e você queria o primeiro, você poderia digitar

!:1

dando

a.txt

Ou, se você quisesse os dois, poderia digitar

!:1-2

dando

a.txt b.txt

Você pode estender isso para qualquer número de argumentos, por exemplo:

!:10-12
Robert Gowland
fonte
@RNA, tentei novamente para garantir que não incluísse um erro de digitação. Você poderia fornecer um pouco mais de detalhes (por exemplo: linha de comando do ubuntu, cygwin para windows? Mensagem de erro? Linha anterior?)
Robert Gowland
Estou usando o GNU bash, versão 3.2.51 (1) -release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. A mensagem de erro é-bash: :1-2: bad word specifier
RNA
2
Eu recebo a mesma coisa se não houvesse dois argumentos na linha anterior. Por exemplo. linha 1 ls a.txtlinha 2ll !:1-2
Robert Gowland 15/02
você está certo. Esse é um erro estúpido que cometi. obrigado!
RNA
Também para obter todos os argumentos, !:^-$pode ser usado ou, claro, código semelhante em combinação com números.
816-8055 26/06
88

!!:nonde né a posição baseada em 0 do argumento que você deseja.

Por exemplo:

echo 'one' 'two'
# "one two"

echo !!:2
# "two"

O !prefixo é usado para acessar comandos anteriores.

Outros comandos úteis:

  • !$ - último argumento do comando anterior
  • !^ - primeiro argumento (após o programa / built-in / script) do comando anterior
  • !! - comando anterior (frequentemente pronunciado "bang bang")
  • !n- número nde comando dehistory
  • !pattern - correspondência de comando mais recente pattern
  • !!:s/find/replace- último comando, substitua findporreplace

Mais informações sobre o histórico de comandos

Johntron
fonte
7
Em vez de !!:s/find/replace, você também pode ^find^replace.
Big McLargeHuge
Além disso: !* - todos os argumentos do comando anterior (após o programa / built-in / script). por exemplo: ls *.tmp *.cache rm !*
Aphoid
68

Na linha de comando, você pode pressionar esc- .ou alt+.

Ele percorre o último argumento dos seus comandos anteriores.

Antonio Mano
fonte
Eu sempre achei as chaves e para trabalhar também.
Bucket
Chaves @Bucket ir embora comandos anteriores, enquanto que a solução fornecida por Antonio permite passar pelos argumentos anteriores (último argumento de cada comando anterior apenas)
everyonesdesign
30

Se você souber o número fornecido no histórico de um comando específico, poderá usar qualquer argumento nesse comando usando os seguintes termos.

Use following para pegar o segundo argumento do terceiro comando no histórico,

!3:2

Use following para pegar o terceiro argumento do quinto último comando do histórico,

!-5:3

Usando um sinal de menos, você pede que ele passe do último comando da história.

Madisz
fonte
19

! * executa um novo comando com todos os argumentos anteriores.

ls /tmp
cd !*
#you are now in /tmp

fonte
Isso não funcionou para mim no OSX - tive que usar $_.
Mike W
16

Sim, você pode usar !$para recuperar o último argumento do comando anterior.

Justin Ethier
fonte
Esteja ciente da palavra-chave "último", especialmente se o seu comando contiver vários argumentos.
Bucket