Como repetir o parâmetro digitado no momento no console bash?

23

Eu estava apenas digitando algo como:

mv foo/bar/poit/zoid/narf.txt

e de repente percebi, caramba, eu tenho que digitar grandes partes desse parâmetro novamente

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

Mesmo com a conclusão incompleta, muita dor. Sei que posso copiar e colar o parâmetro, selecionando o texto e clicando com o mouse, mas isso não é bom o suficiente. Eu quero permanecer no teclado.

Então, existe uma maneira de copiar e colar o parâmetro atual da linha usando o teclado?

k0pernikus
fonte
3
Meu conselho não responde à sua pergunta, mas é uma pequena dica. Como no seu exemplo, você pode usar a próxima construção: em mv foo/bar/poit/zoid/{narf.txt,troz.txt}vez de digitar / copiar o endereço longo duas vezes.
apressar
2
Ligeiramente menor do que @ solução de Rush: mv foo/bar/poit/zoid/{narf,troz}.txt. Isto funciona especialmente bem se tivermos algo como.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann
@Rush Você se importa em apontar como resposta? Pode não ser diretamente o que eu pedi, mas, novamente, sua solução é muito mais do que eu quero. Merece um sinal de aceitação.
K0pernikus

Respostas:

15

Se planejei com antecedência, uso a expansão de chaves . Nesse caso:

mv foo/bar/poit/zoid/{narf,troz}.txt

Aqui está outra abordagem usando os readlineatalhos de teclado padrão :

  • mv foo/bar/poit/soid/narf.txt: iniciar
  • Ctrl- w: unix-word-ruboutpara excluirfoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yank, espaço, yanknovamente para obtermv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-wordduas vezes para excluir o últimonarf.txt
  • troz.txt: digite a parte da cauda que é diferente

Se você gastar algum tempo não trivial usando o bashshell, recomendo ler periodicamente uma lista dos atalhos padrão e escolher alguns que parecem úteis para aprender e incorporar à sua rotina. O capítulo 8 do bashmanual é um bom lugar para começar. Conhecer os atalhos pode realmente aumentar sua eficiência.

jw013
fonte
Arrumado! No meu caso, tive que pressionar Alt + Backspace em vez de Meta + Backspace.
precisa saber é o seguinte
3
@ k0pernikus Sim, na maioria dos teclados, a tecla Alt é a tecla Meta.
Jw013 12/07/2012
1
Para salvar a redigitação .txt, pressione Ctrl + Esquerda (ou qualquer outro atalho que chama backward-word), depois Esquerda um caractere, Alt + Backspace e digite troz.
wjandrea
24

A expansão do histórico também funciona no comando atual, usando o designador de evento !#. Combine isso com a designação de palavra para o último argumento - $- para obter o parâmetro que você acabou de digitar. E você pode usar todos os modificadores regulares sobre ele; portanto, se, por exemplo, você estiver renomeando um arquivo em um diretório distante, basta digitar:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
qwertyboy
fonte
Muito útil! Isso funciona especialmente bem com a magic-spaceopção do bash no inputrc para expandir automaticamente as expansões do histórico. (Eu não poderia usar a resposta mais votados porque eu definir ^ W para quebrar em barras já que é geralmente mais útil.)
Soren Bjornstad
@SorenBjornstad alt+backspacenormalmente já pára em separadores de palavras como barras, assim você não precisa mudar a forma como ^Wobter essa funcionalidade, você pode ter os dois não-palavra-caráter de exclusão ou espaços em branco delimitado palavras
Eric Renouf
14

Como no seu exemplo, você pode usar a próxima construção:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}

ou mesmo (como sugerido Ansgar Esztermann ):

mv foo/bar/poit/zoid/{narf,troz}.txt

em vez disso, digite o endereço longo duas vezes.

pressa
fonte
2
Isso é chamado de expansão de chave .
CodeGnome
6

Brincando, consegui que isso funcionasse:

mv foo/bar/poit/zoid/narf.txt

Pressione Enter
para armazenar o último parâmetro.

Agora use para ser digitado pela última vez na linha de volta. Digite um espaço e, para obter o último parâmetro usado, use:

Alt + .

Detesto provocar um erro, mas ele faz o trabalho nesse caso de uso.

k0pernikus
fonte
Legal, outra ótima dica aprendida!
Bram
<kbd> Esc </kbd> + <kbd>. </kbd> é (é?) o mesmo que <kbd> Alt </kbd> + <kbd>. </kbd>.
Nikos Alexandris
2

Você pode usar facilmente variáveis:

a=test.csv ; cp $a $a.bak

Ou, no seu caso (a competição de guias de notas funciona para uma parte):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt
ppp
fonte
2

Eu tenho isso no meu ~/.inputrc:

"\ej":"!#:$\e^"

!#é a linha atual, :$é a última palavra e \e^é history-expand-line.

nisetama
fonte
isso deve ser marcado como a resposta. Pressionar 'alt / option + j' agora copia a última palavra.
mpprdev
2

Para zsh, acho as seguintes combinações de teclas úteis.

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

Então eu apertei Alt- Mpara repetir o último argumento Alt- Kse eu quiser excluir partes do final de um caminho.

Aqui está uma referência útil para alguns dos comportamentos que você pode mapear.

bdellaterra
fonte
2

Uma solução interativa curta de duas etapas

  1. tipo: echo foo/bar/poit/zoid/narf.txt

    Isso torna foo/bar/poit/zoid/narf.txtdisponível para o Alt- .atalho no bash.

  2. digite: mve sucesso Alt- ., Space, Alt-.

    Você receberá mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt. Agora você pode modificar a última palavra facilmente.

Comandante da meia-noite

Essa ferramenta que pode ser (muito) útil é um gerenciador de arquivos em execução no console. Permite copiar nomes de arquivos e caminhos de diretório interativamente na linha de comando. O Midnight Commander mostra, portanto, 2 painéis (esquerdo e direito), que listam o conteúdo de diferentes diretórios.

Um pequeno guia:

  • UpAs Downteclas de seta / selecionam arquivos no painel atual.
  • Tab alterna entre os painéis esquerdo e direito.
  • Ctrl- Shift- Entercopia o arquivo atualmente selecionado para a linha de comando (incluindo o caminho completo)
  • Alt- oabre o diretório atualmente selecionado no outro painel
  • Ctrl- opermite ver o console em tela cheia
  • Ctrl- x, pcopia o caminho do painel ativo no console
  • Ctrl- x, Ctrl- pcopia o caminho do painel inativo no console
  • Esc- Tabé conclusão automática

Essa é de longe a maneira mais rápida que encontrei até agora - depois que me acostumei com os atalhos.

Markus Dutschke
fonte
0

Use a mesma coisa no {,} "duplicador". Ou seja:

git tag -m {v,v}1.0.1

# same as 

git tag -m v1.0.1 v1.0.1
Pylinux
fonte