Gostaria de melhorar um pouco meu fluxo de trabalho com o Bash e percebo que muitas vezes desejo executar o mesmo comando em um executável diferente.
Alguns exemplos:
Git (onde eu gostaria de mudar rapidamente a segunda palavra):
git diff foo/bar.c
git checkout foo/bar.c
Cat / rm (onde somente a primeira palavra deve ser alterada):
cat foo/is/a/very/long/path/to/bar.c
rm foo/is/a/very/long/path/to/bar.c
Sei que posso pressionar Ctrl+ ae Delremover a primeira palavra, mas estou me perguntando se existe uma maneira mais rápida de fazer isso.
Respostas:
!$
expande para a última palavra do seu comando anterior.Então você poderia fazer:
ou:
Seus exemplos repetiram apenas a última palavra, então
!$
funcionaram bem. Se você realmente tinha muitos argumentos que desejava repetir e só queria alterar a primeira palavra, poderia usar o!*
que se expande para todas as palavras do comando anterior, exceto o zeroth.Veja a seção "HISTORY EXPANSION" da
bash
página de manual. Há muita flexibilidade lá.fonte
!$
você não há controle visual completo da linha que está executando . Isso pode resultar prejudicial às vezes. Especialmente se você tiver um erro de impressão. É preciso dohistory
que expandir. Portanto, se você escrever o último comando com um espaço em branco no início, provavelmente esse comando não será concluído no histórico. Quando você executará seu novo comando com!$
o shell, não pegará os parâmetros da última linha de comando digitada, mas apenas do último da história. Aqui mesmo mais palavras.#
ou umecho
para que eu possa vê-lo e entrar na história para que eu possa recuperá-lo e executá-lo novamente sem o prefixo de desativação.Ctrl+ apara ir para o início da linha e, em seguida, Alt+ dpara excluir a primeira palavra.
fonte
Meta+D
só será válido seemacs
estiver ativado (viaset -o emacs
ou simplesmente por padrão). Não funcionará no modo de editor inferior ou seemacs
estiver desativado.C-a
eM-d
é muito mais rápido digitar se suas mãos já estiverem na posição de digitação.cat
e compare o que você obtém ao pressionar Início (^[[H
aqui) e ao pressionar Ctrl + a (^A
).Não tenho certeza se seria realmente mais rápido ou não, mas consulte este artigo, especialmente o ponto # .3:
fonte
Alt+.
Se você precisar apenas repetir a última parte de um dos comandos anteriores, poderá usar Alt+ .que colará o último argumento obtido da última linha do histórico.
Se pressionado mais de uma vez, substituirá o que acabou de ser colado com o último argumento da linha antes ...
Por exemplo, se os últimos 2 comandos foram:
No shell eu escrevo
rm
e pressiono Alt+ .ele aparecerá:se eu pressionar novamente Alt+ .ele aparecerá
e assim por diante...
fonte
bash
. BTW Tem certeza de que está usando o bash como shell ?≥
Além da resposta @jjlin, você pode estar interessado nas seguintes dicas:
$_
contém o último argumento da linha de comando anteriorPara obter mais informações, consulte a seção "Readline Command Names" da página de
bash
manual.por exemplo:
fonte
n
palavras do comando,n = 1
no primeiro exemplo en = 2
no segundo. A resposta de jjlin mostra como excluir a primeira palavra (e reaplicando o atalho, exclua até asn
palavras). Sua resposta lista alguns atalhos do Bash (que são realmente úteis), mas nenhum deles é uma maneira eficiente de excluir as primeirasn
palavras.$_
parâmetro provavelmente funcionaria se houvesse apenas um argumento (ou seja,n = m - 1
ondem
é o número total de argumentos). O restante dos atalhos é irrelevante para a questão.Se você é proficiente em vi, você pode ativar vi ligações em bash (a maioria das conchas?) Usando o comando
set -o vi
. Em seguida, você pode usar as teclas vi normais para editar seu comando. No seu primeiro exemplo, você pode ^wcwexcluir "diff" e alterá-lo para checkout.Pode não valer a pena aprender as combinações de teclas do vi apenas para editar a linha de comando, mas se você já as conhece, é um ótimo aumento de produtividade.
fonte
set -o vi
como eu vivia! Eu também faço isso nos meus prompts do bash.bindkey -v
para zsh.Esc
0
c
w
Existem muitas maneiras de esfolar esse gato!
Para substituir uma sequência específica,
^old^new^extra
execute o comando anterior, substituaold
pornew
e acrescenteextra
. Você pode parar o quanto quiser; por exemplo^old
, substituiráold
a sequência vazia e acrescentará a sequência vazia (essencialmente excluindoold
e não fazendo mais nada).Variante especialmente útil disso:
Para substituir uma palavra específica, você pode usar
!m:n-p
para se referir às palavrasn
atravésp
do comandom
(números negativos uso de contar para trás a partir do comando atual). Você pode omitir a-p
parte para se referir a uma única palavra e omitir a:m-p
parte para se referir a um comando inteiro. Formulários especiais!!
para!-1
,!$
para a última palavra do comando anterior e!*
para os argumentos (exceto a palavra0
) do comando anterior são bastante úteis.Costumo usar os dois; O zsh é especialmente bom aqui, pois pressionar a tecla tab expandirá as coisas enigmáticas para garantir que você esteja certo.
Também existem muitas maneiras de fazer isso com a edição de linhas. Leia as combinações de teclas do seu shell.
fonte
A maioria dos programas de terminal suporta ...
<Up-Arrow>
conforme necessário para exibir novamente uma das linhas de comando anteriores do histórico.<Down-Arrow>
conforme necessário para avançar na lista de histórico.<Left-Arrow>
conforme necessário para mover o cursor até o final da segunda palavra.<Backspace>
conforme necessário para apagar a segunda palavra.<Right-Arrow>
/<Left-Arrow>
conforme necessário para reposicionar para mais alterações.<RETURN>
para executar o comandoSe a linha de comando que você deseja não for recente, faça uma pesquisa inversa com a
<Ctrl-r>
descrição em questão ...Existe uma maneira de usar ctrl-r depois de digitar parte do comando no bash?
Em seguida, edite através das teclas de seta, conforme necessário.
fonte
O que eu faço (Ubuntu / bash):
1)
Arrow up
ei para retornar o comando anterior2)
Home
tecla para retornar ao início3) Modifique o comando conforme necessário.
À prova de idiotas e especialmente útil para comandos de várias linhas.
fonte