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-arge \e\C-ysão mapeados para yank-nth-arg. Infelizmente, parece não haver um comando (único) que adicione vários argumentos anteriores de uma só vez.