Como mudar rapidamente a primeira palavra em um comando Bash?

44

Eu gostaria de melhorar um pouco o meu fluxo de trabalho com o Bash, e percebo que muitas vezes desejo executar o mesmo comando para 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 precisa ser alterada):

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

Eu sei que posso pressionar Ctrl + a e então Del para remover a primeira palavra, mas estou querendo saber se existe uma maneira mais rápida para fazer isso.

    
por nowox 22.01.2015 / 08:36

9 respostas

56

!$ expande para a última palavra do seu comando anterior.

Então você poderia fazer:

cat foo/is/a/very/long/path/to/bar.c

rm !$

ou:

git diff foo/bar.c

git checkout !$

Seus exemplos aconteceram apenas para repetir a última palavra, então !$ funcionou bem. Se você realmente tinha muitos argumentos que queria repetir, e só queria mudar a primeira palavra, você poderia usar !* , que se expande para todas as palavras do comando anterior, exceto o zeroth.

Consulte a seção "EXPANSÃO DO HISTÓRICO" da página bash man. Há muita flexibilidade lá.

    
por 22.01.2015 / 10:27
28

Ctrl + a para ir ao começo da linha, depois Alt + d para apagar o primeira palavra.

    
por 22.01.2015 / 08:40
17

Não tenho certeza se seria realmente mais rápido ou não, mas veja este artigo particularmente ponto # .3:

  1. Replace a string from the previous command using ^str1^str2^

In the following example, first we executed the ls command to verify a file. Later we realized that we want to view the content of the file. Instead of typing the whole file name again, we can just replace the “ls” in the previous command with “cat” as shown below.

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate
    
por 22.01.2015 / 09:39
15

Alt + .

Se você precisar apenas repetir a última parte de um dos comandos anteriores, você pode usar Alt + . , que colará o último argumento da última linha de a história.

Se pressionado mais de uma vez substituirá o que acabou de ser colado com o último argumento da linha antes ...

Por exemplo se os dois últimos comandos foram:

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

No shell eu escrevo rm e pressiono Alt + . ele aparecerá:

rm foo/is/a/very/long/path/to/SomeWhereElse.c

se eu pressionar novamente Alt + . ele será exibido

rm foo/is/a/very/long/path/to/bar.c

e assim por diante ...

    
por 22.01.2015 / 15:44
11

Além da resposta @jjlin, você pode se interessar pelas seguintes dicas:

  • Ctrl + w apaga a palavra à sua esquerda
  • Ctrl + k apaga do cursor para o final da linha de comando
  • Ctrl + u apaga do cursor para o início da linha de comando
  • Alt + b move o cursor uma palavra para trás
  • Alt + f move o cursor uma palavra para a frente
  • $_ contém o último argumento da linha de comando anterior

Para saber mais sobre isso, consulte a seção "Readline Command Names" da página bash .

por exemplo:

cat foo/is/a/very/long/path/to/bar.c
rm $_
    
por 22.01.2015 / 09:21
7

Se você é proficiente no vi, você pode ativar ligações do vi no bash (a maioria das shells?) usando o comando set -o vi . Então, você pode usar as teclas vi normais para editar seu comando. No seu primeiro exemplo, você poderia fazer ^ w c w para apagar "diff", depois alterá-lo para checkout.

Pode não valer a pena aprender as combinações de teclas vi apenas para editar a linha de comando, mas se você as conhece, é um ótimo impulsionador da produtividade.

    
por 22.01.2015 / 15:11
5

Existem muitas maneiras de esfolar esse gato!

Para substituir uma string específica, ^old^new^extra receberá o comando anterior, substituirá old por new e acrescente extra . Você pode parar o quanto quiser; por exemplo. ^old substituirá old pela string vazia e anexará a string vazia (essencialmente excluindo old e não fazendo mais nada).

1. ^diff^checkout
2. ^cat^rm

Variante especialmente útil disso:

for i in 'seq 1 10'; do echo something complicated; done
# inspect the output to see if it looks right
^echo

Para substituir uma palavra específica, você pode usar !m:n-p para se referir às palavras n a p do comando m (use números negativos para contar de volta a partir do comando atual). Você pode omitir a parte -p para se referir a uma única palavra e omitir a parte :m-p para se referir a um comando inteiro. Formulários especiais !! para !-1 , !$ para a última palavra do comando anterior e !* para os argumentos (todos menos a palavra 0 ) do comando anterior são muito úteis.

1. !!:0 checkout !!:2-
2. rm !*

Eu geralmente uso os dois; O zsh é especialmente legal aqui, já que clicar na guia expandirá as informações ocultas para garantir que você acertou.

Existem também muitas maneiras de fazer isso com a edição de linha. Leia os atalhos de teclado do seu shell.

    
por 24.01.2015 / 22:51
-2

A maioria dos programas de terminal suporta ...

  • Pressione <Up-Arrow> conforme necessário para exibir novamente uma das linhas de comando anteriores do histórico.
    • Pressione <Down-Arrow> conforme necessário para avançar na lista do histórico.
  • Pressione <Left-Arrow> conforme necessário para mover o cursor para o final da segunda palavra.
  • Pressione <Backspace> conforme necessário para apagar a segunda palavra.
  • Digite a segunda palavra de substituição.
    • Pressione <Right-Arrow> / <Left-Arrow> conforme necessário para reposicionar para mais alterações.
  • Pressione <RETURN> para executar o comando

Se a linha de comando que você deseja não for recente, faça uma pesquisa reversa com <Ctrl-r> , conforme descrito na pergunta ...
Existe uma maneira de usar ctrl-r depois de digitar parte do comando em bash?
Em seguida, edite por meio das teclas de seta, conforme necessário.

    
por 29.01.2015 / 08:53
-3

O que eu faço (Ubuntu / bash):

1) Arrow up hey para retornar o comando anterior
2) tecla Home para retornar ao começo do jogo 3) Modifique o comando conforme necessário.

À prova de idiotas e especialmente útil para comandos de várias linhas.

    
por 29.01.2015 / 17:15

Tags