Como posso recuperar o argumento do comando bash anterior?


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.


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

@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


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.


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.


19

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

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

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.


Esteja ciente da palavra-chave "último", especialmente se o seu comando contiver vários argumentos.
Bucket
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.