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

23

Eu estava apenas digitando algo nos seguintes termos:

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

e de repente percebi, droga, 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 completa, é uma dor e tanto. Eu sei que posso copiar e colar o parâmetro selecionando o texto e o middleclick, 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?

    
por k0pernikus 06.06.2012 / 11:47

9 respostas

12

Se planejei com antecedência, use expansão de contraventamento . Aqui está outra abordagem usando os atalhos de teclado padrão readline :

  • mv foo/bar/poit/soid/narf.txt : start
  • Ctrl-w : unix-word-rubout para excluir foo/bar/poit/soid/narf.txt
  • Ctrl-y Espaço Ctrl-y : yank , espaço, yank novamente para obter mv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta-back-space Meta-retrocesso : backward-kill-word duas vezes para apagar o ultimo narf.txt
  • troz.txt : digite a parte da cauda que é diferente

Se você gastar algum tempo não trivial usando o bash shell, eu recomendaria ler periodicamente uma lista de atalhos padrão e escolher alguns que pareçam úteis para aprender e incorporar em sua rotina. Capítulo 8 do manual bash é um bom lugar para começar. Conhecer os atalhos pode realmente aumentar sua eficiência.

    
por 07.06.2012 / 01:40
22

A expansão do histórico também funciona no comando atual, usando o designador de evento !# . Combine isso com o designador de palavras para o último argumento - $ - para obter o parâmetro que você acabou de digitar. Além disso, você pode usar todos os modificadores regulares, por isso, 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
    
por 31.10.2014 / 23:42
12

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

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

ou até mesmo (como sugerido Ansgar Esztermann ):

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

em vez de digitar / copiar o endereço longo duas vezes.

    
por 06.06.2012 / 12:25
6

Brincando, tenho isso para funcionar:

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. Digite um espaço e use o último parâmetro usado:

Alt + .

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

    
por 06.06.2012 / 11:57
2

Você pode usar variáveis fáceis:

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

Ou no seu caso (a concorrência da guia de notas funciona para a parte a ):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt
    
por 04.02.2014 / 13:28
2

Uma solução de duas etapas de solução interativa curta:

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

Isso torna foo/bar/poit/zoid/narf.txt avaylable para o atalho Alt -. no bash.

2. digite: mv e pressione Alt -. , Espaço , Alt -.

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

Uma ferramenta que pode ser (muito) útil é:

Midnight Commander - um gerenciador de arquivos em execução no console. Ele dá a você a possibilidade de copiar nomes de arquivos e caminhos de diretório interativamente na linha de comando. O comando da meia-noite mostra-lhe dois painéis (esquerdo e direito), que listam o conteúdo de diferentes diretórios.

Um breve guia:

  • As teclas de seta Up Abaixo selecionam arquivos no painel atual.
  • Tab alterna entre o painel esquerdo e direito.
  • Ctrl-Shift-Enter copia o arquivo atualmente selecionado para a linha de comando (incluindo o caminho completo)
  • Alt-o abre o diretório atualmente selecionado no outro painel
  • Ctrl-o permite ver o console em tela cheia
  • Ctrl-x p copia o caminho do painel ativo para o console
  • Ctrl-x Ctrl-p copia o caminho do painel inativo para o console
  • Esc-Tab é auto-completar

Esta é, de longe, a maneira mais rápida que encontrei até agora - depois que alguém se acostumou com os atalhos.

    
por 02.03.2017 / 10:02
2

Eu tenho isso no meu ~/.inputrc :

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

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

    
por 08.04.2017 / 05:29
2

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

# 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 - M para repetir o último argumento então Alt - K se eu quiser exclua partes do final de um caminho.

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

    
por 05.05.2017 / 18:51
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
    
por 05.08.2015 / 10:33