No Bash, existem alguns operadores úteis para repetir partes do último comando:
!^
expande para o primeiro argumento do comando anterior, por exemplo,$ echo one "two three" one two three $ echo !^ echo one one
!$
expande para o último argumento do comando anterior, por exemplo,$ echo one "two three" one two three $ echo !$ echo "two three" two three
!*
expande para todos os argumentos do comando anterior, por exemplo,$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(Pelo que entendi, esses são açúcares sintáticos para !!:^
, !!:$
e !!:*
respectivamente, onde !!
é um designador de eventos que se expande para o comando anterior e ^
, $
e *
são designadores de palavras, consulte o Manual de Referência do Bash ou man bash
.)
Estes são frequentemente bastante úteis. Mas fica ainda mais legal com os atalhos do teclado:
Quando você pressiona Alt+ .ou Alt+ _, o último argumento do comando anterior é inserido no comando atual, da mesma forma como se você tivesse escrito
!$
naquele momento.Também é possível pressionar Alt+ Ctrl+ ypara inserir o primeiro argumento do comando anterior, como se você tivesse escrito
!^
naquele momento.
(Veja a GNU Readline Library ou info readline
.)
Costumo preferir os atalhos de teclado aos operadores de histórico do Bash, porque posso ver o que estou inserindo antes de executar o comando. No entanto, não parece haver um atalho que me permita inserir todas as palavras do comando anterior, ou seja, aquele que executa !*
o trabalho. Pelo menos eu não consegui encontrar.
Existe um atalho? Caso contrário, é possível configurar a biblioteca readline para adicionar uma e como?
zsh
, se você digitar echo !*
e pressionar TAB, terá o efeito desejado. Em geral, o TAB enquanto estiver na linha de leitura expandirá todo o expansível. Muito conveniente; provavelmente bash terá alguma configuração para o mesmo efeito? @ Set, acho que esta é a linha de leitura do bash, não o emulador de terminal - embora não tenha certeza.
man bash
( em algum lugar na linha 3030)
\e.
e \e_
são mapeados para a função readline yank-last-arg
e \e\C-y
são mapeados para yank-nth-arg
. Infelizmente, parece não haver um comando (único) que adicione vários argumentos anteriores de uma só vez.