Como repito o último comando sem usar as setas?

96

Eu sei que posso usar Up para percorrer os comandos anteriores. Executar o comando último simplesmente envolve Acima + Enter . No entanto, eu estava pensando em comprar o Teclado Happy Hacking , pois passo muito tempo em vim .

Este teclado não tem teclas de seta, e a única maneira de saber como obter esse tipo de comportamento é pressionando Ctrl + R e começando a repetir meu comando anterior .

Existe uma maneira fácil de emular Acima + Enter em um terminal UNIX sem as teclas de seta?

    
por quant 31.07.2014 / 05:12

13 respostas

143

Com csh ou qualquer shell implementando a substituição do histórico em csh ( tcsh , bash , zsh ):

!!

Então Digite .

Ou alternativamente :

!-1

Então Digite .

Ou Ctrl + P , Digite

Espaço mágico

Além disso, observe que !! e !-1 não serão expandidos automaticamente para você até que você os execute (quando for tarde demais).

Se estiver usando bash , você pode colocar bind Space:magic-space em ~/.bashrc e depois pressionar Espaço depois que o comando os expandirá automaticamente, permitindo que você os inspecione antes da execução. Isto é particularmente útil para a expansão do histórico de um comando executado há algum tempo, e. !echo irá puxar o último comando executado começando com echo . Com espaço mágico, você visualiza o comando antes de ser executado.

Isso equivale a fazer bindkey ' ' magic-space em tcsh ou zsh .

    
por 31.07.2014 / 05:53
42

A maioria dos shells que possuem um recurso de edição de linha de comando suporta ligações de teclas Emacs. (um minúsculo subconjunto)

Up     Ctrl+P
Down   Ctrl+N
Left   Ctrl+B
Right  Ctrl+F
Home   Ctrl+A
End    Ctrl+E
Delete Ctrl+D

Como alternativa, você pode configurar seu shell para usar o modo de edição de comandos do VI, adicionando set -o vi ao seu arquivo de inicialização do shell (por exemplo, ~/.bashrc ). Então, por exemplo, você pode

  • Use Esc k Entrar para reexecutar o comando anterior (o mesmo que !! ). A tecla menos - também funciona como um comando "subir".
  • Use Esc k k k k k k k k k k k k Enter ou Esc 1 2 k Entrar para reexecutar o 12º comando anterior (o mesmo que !-12 ).
  • Use Esc e um comando de movimento (isto é, k , adequadamente repetido), e então edita a linha de comando bash que você encontra lá. Lembre-se, você ainda estará no modo de comando vi , então você precisará usar um comando vi editing (por exemplo, I , A , C , R , ou uma de suas contrapartes minúsculas) para realmente adicionar ao comando da história.
    Então, por exemplo, Esc k i s u d o Espaço Enter é equivalente a sudo !! .
  • Para usuários avançados: você pode até copiar texto ( y ank) de uma linha e cole ( p ut) em outro, para que você possa obter resultados comparáveis a !-2:- !$ . (Infelizmente, parece não suportar buffers nomeados).
por 01.08.2014 / 01:52
22

O meu favorito é CTRL + P e depois CTRL + O

Isso funciona por padrão, sem necessidade de configuração extra. ^ P permitirá que você mude para o último comando e ^ O permitirá que você execute a linha atual

Note que CTRL + O pode ser usado quantas vezes quiser

    
por 31.07.2014 / 06:11
14

Claro! Como você está acostumado a vi keybindings, por que não configurar seu shell para responder a eles? Para bash , coloque isso no seu ~/.inputrc :

set editing-mode vi

As instâncias em execução do bash não relerão o arquivo, então efetue logout e volte.

zsh detectará isso para você: se nenhum dos seus scripts de inicialização forçar o modo de edição de uma forma ou de outra usando bindkey e se a variável de ambiente $EDITOR for detectada contém vi , então ativará automaticamente vi keybindings. Se você precisar forçá-lo, coloque isso no seu ~/.zshrc :

bindkey -v

Depois disso, use ESC como de costume para entrar na linha de comando e k e j para mover para cima e para baixo.

TAMBÉM : As ligações de shell padrão na maioria das shells são as ligações do emacs, então, na verdade, Crtl-P e Ctrl-N já devem funcionar sem você ter que mudar nada.

    
por 31.07.2014 / 05:19
7

Com qualquer shell POSIX implementando a opção Portabilidade do usuário (incluindo ksh , zsh , bash , yash ), você também pode usar o comando fc :

fc -e : -1

Veja um exemplo:

$ echo "hello"
hello

$ fc -e : -1
echo "hello"
hello

Mais informações em Execute uma série de comandos da história de Jonathan Leffler.

    
por 31.07.2014 / 09:57
5

Acho que preciso refazer comandos como superusuário com frequência, então

sudo !!

refaz o comando anterior como se eu tivesse lembrado de digitar sudo em primeiro lugar.

    
por 31.07.2014 / 23:16
4

Para todos os usuários do Mac iterm2:

Você pode ligar + R a 0x0C 0x10 0x0d . Isso limpará o terminal e executará o último comando.

    
por 06.08.2014 / 00:43
2

Com csh ou qualquer shell implementando a substituição do histórico csh ( tcsh , bash , zsh ), você também pode usar o !<beginning of command> para chamar o último comando que começa com <beginning of command> .

por exemplo, se você executou

$ tail file.txt
$ less otherfile.txt
$ !ta

!ta executaria tail file.txt

    
por 31.07.2014 / 21:09
1

O shell ksh tem um alias padrão r que repete o comando mais recente. Está ligado a fc -s :

alias r='fc -s'

Curiosamente, a documentação bash para o fc builtin ( help fc e também no próprio manual) menciona isso, mas não é um alias padrão nesse shell:

A useful alias to use with this is r='fc -s', so that typing r cc runs the last command beginning with cc and typing r re-executes the last command.

Em bash , isso também funcionaria mesmo se você desativasse as expansões de histórico com set +H .

No shell zsh , há um r incorporado que é documentado como o mesmo que fc -e - .

O utilitário fc é um utilitário padrão POSIX .

    
por 30.11.2018 / 20:26
0

Quando estou usando um bom emulador xterm, por exemplo putty, minha maneira favorita de proceder é selecionar o comando, incluindo alimentação de linha, copiá-lo para a área de transferência e, em seguida, use o botão direito do mouse para colá-lo. Isso repete o comando em um único clique. Isso também funciona bem para uma seqüência de comandos separados por ponto e vírgula.

    
por 12.12.2016 / 16:52
0

tl; dr !! apenas acrescenta o último comando ao seu comando atual. <backtick>!!<backtick> executa o último comando e acrescenta a saída ao seu comando atual.

Na verdade, existem duas variantes:

  1. O último comando em si
  2. O resultado do último comando

Deixe-me mostrar dois exemplos:

Exemplo 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Como você vê acima, estou executando um comando e basicamente apenas adicionando o último comando.

Outra variação

Exemplo 2

$ find ~/Documents "test.txt"
/Users/<user>/Documents/test.txt

$ vi '!!'
# Opens test.txt. But if you do
$ vi !!
vi find ~/Documents -name "test.txt"
VIM - Vi IMproved 8.1 (2018 May 18, compiled Oct 29 2018 06:55:58)
Unknown option argument: "-name"
More info with: "vim -h"
    
por 30.11.2018 / 19:33
0
  • Digite History e anote o número na frente do comando que você executar e usar !number

  • Você também pode usar ! - 1 (sendo 1 o último comando executado, substitua com o número de contagem que você recebe quando você faz isso de baixo mantendo o último executado como 1)

  • ! - 2 (o segundo último e assim por diante)
por 30.11.2018 / 21:36
-1

você pode usar !n para executar o nth comando no terminal. onde 'n' é a linha não do comando history .

    
por 18.02.2018 / 17:24