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.