Gostaria de saber se é possível apenas repetir parte de um comando. Ou seja, se eu fizer isso ls /path/to/somewhere -a
, eu só quero remover ls
e -a
.
Eu sei que se eu fizer !!
isso repete o comando anterior (anexando o último comando ao comando que você escrever antes) e que se eu fizer !$
isso inclui a última parte da string, mas eu gostaria de saber se é possível refazer - use apenas a parte do meio, por exemplo, do comando anterior.
Claro, use
!^
por exemplo
Alternativamente (incorrendo em um pressionamento de tecla extra), você pode usar
!:1
.Isso está totalmente documentado nas seções Designadores de eventos e Designadores de palavras da
bash
página man .Expandindo a resposta de @steve para atender sua solicitação geral:
Você pode usar vários intervalos de palavras para reorganizar um comando anterior:
!:x
, para recuperar a x- ésima palavra, a primeira palavra é 0 a!:x-y
, para recuperar a palavra x th a y th , inclusivePor exemplo:
Observe que os operadores de redirecionamento contam como palavras individuais , portanto:
A seleção de palavras por índice pode ser expandida para funcionar com comandos diferentes dos mais recentes:
!-n
, selecione o enésimo comando mais recente!string
, selecione o comando mais recente começando comstring
Assim, combinando esses você pode obter:
Costumo pensar no histórico de comandos como uma matriz - linhas de comandos, colunas de palavras - o que torna esse tipo de navegação natural.
Um cuidado: criar novos comandos suturando partes de antigos pode levar a comandos com efeito irreversível. Eu recomendo colocar
:p
um dos argumentos para exibir o comando construído, em vez de invocá-lo.Por exemplo:
rm !ls:1-4:p
. Isso imprimirá orm
comando final, após inserir o 1º ao 4º argumento do comando mais recentels
.Bash tem um
yank-last-arg
comando para trabalhar com seu histórico de comandos:Com as combinações de teclas padrão, você pode ativá-lo pressionando Meta.. 1 Isso copia a última palavra do seu comando mais recente para onde está o cursor.
Para copiar a enésima palavra em vez da última palavra, pressione , depois .MetanMeta.
Acho que isso é mais fácil de usar e menos propenso a erros do que a expansão do histórico , pois funciona de forma interativa.
Outra maneira de ajustar um comando anterior interativamente é usar o
edit-and-execute-command
recurso:Use as teclas de seta para cima/para baixo para recuperar o comando e pressione CtrlX, CtrlEpara abrir esse comando em seu arquivo
$EDITOR
. Você pode editar o comando ao seu gosto e, quando salvar e sair do editor, ele será executado.1 Dependendo do layout do teclado, Metapode significar manter pressionada uma Alttecla, pressionar uma Optiontecla ou pressionar e soltar a Esctecla. O .é o ponto ou ponto final, caso você tenha dificuldade em lê-lo aqui.
Seta para cima. Em seguida,
backspace
para remover alguns caracteres.Ctrl+A
para pular para o início da linha,DEL
para remover alguns caracteres. Feedback visual todo o caminho, sem adivinhação.Ctrl+E
para voltar ao fim da linha.