Como repito o último comando sem usar as teclas de seta?

115

Eu sei que posso usar Uppara percorrer os comandos anteriores. A execução do último comando envolve simplesmente Up+ Enter. No entanto, eu estava pensando em comprar o Happy Hacking Keyboard enquanto passo muito tempo vim.

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

Existe uma maneira fácil de emular Up+ Enterem um terminal UNIX sem as teclas de seta?

quant
fonte
11
Você deve substituir a etiqueta do terminal pelo shell que você usa.
Cristian Ciupitu
2
@ illuminÉ no mouse ...
quant
O Happy Hacking Keyboard não foi descontinuado em 2006?
Peter Mortensen
@PeterMortensen não, ainda está disponível. Você pode estar se referindo à primeira versão, mas os modelos mais recentes continuam disponíveis.
quant

Respostas:

164

Com cshou qualquer shell implementação csh-como história de substituição ( tcsh, bash, zsh):

!!

Então Enter.


Ou, alternativamente :

!-1

Então Enter.


Ou Ctrl+ P,Enter


Espaço mágico

Além disso, observe que !!e !-1não será expandido automaticamente até você executá-los (quando for tarde demais).

Se estiver usando bash, você pode colocar bind Space:magic-spaceem ~/.bashrc, em seguida, pressionando Spacedepois o comando de expansão automática-los em linha, permitindo que você inspecioná-los antes da execução. Isso é particularmente útil para a expansão do histórico de uma execução de comando há um tempo atrás, por exemplo !echo, puxará a última execução de comando começando com echo. Com espaço mágico, você pode visualizar o comando antes que ele seja executado.

Isso é o equivalente a fazer bindkey ' ' magic-spaceem tcshor zsh.

Sparhawk
fonte
11
@ Arman Fico feliz em ajudar. Há muitos comandos de expansão do histórico; o link lista alguns deles. Editei algumas informações sobre o espaço mágico que podem ajudar no uso de algumas delas.
Sparhawk 31/07
3
magic-spaceessa é uma opção doce!
fduff 31/07
11
Há também a histverifyopção shoptque fará com que o readline execute a expansão do histórico, mas não execute o comando ao pressionar a tecla Enter pela primeira vez. O que permitirá avaliar o resultado e decidir se é isso que você deseja executar.
Etan Reisner 31/07
2
Nunca entendi o porquê !! é usado muito mais que o CTRL-P. CTRL-P permite que você veja o comando antes de executá-lo - e você pode até fazer modificações nele. Eu sempre sinto que estou rolando os dados com !!.
abonet 5/08/14
11
@abonet Outro uso que eu acabei de encontrar !!é usar sua expansão no local . Por exemplo sudo !!.
Sparhawk
50

A maioria dos shells que possuem um recurso de edição de linha de comando suporta as ligações de teclas do Emacs. (um pequeno 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 vi, adicionando set -o viao seu arquivo de inicialização do shell (por exemplo, ~/.bashrc). Então, por exemplo, você pode

  • Use EsckEnter para executar novamente o comando anterior (igual a !!). A tecla menos -também funciona como um comando "subir".
  • Use EsckkkkkkkkkkkkEnter ou Esc12kEnter para reexecutar o 12º comando anterior (o mesmo que !-12).
  • Use Esce um comando de movimento (ou seja, krepetido adequadamente) e edite a linha de comando do bash que você encontra lá. Lembre-se, você ainda estará no vimodo de comando, assim que você vai precisar usar um vicomando de edição (por exemplo, I, A, C, R, ou um dos seus homólogos minúsculas) para realmente acrescentar ao comando da história.
    Então, por exemplo, EsckisudoSpaceEnteré equivalente a sudo !!.
  • Para usuários avançados: você pode até copiar ( y ank) texto de uma linha e colá-lo ( p ut) em outra, para obter resultados comparáveis !-2:- !$. (Infelizmente, parece não suportar buffers nomeados.)
Gilles
fonte
Eu sabia sobre a relação emacs com o terminal ... mas o vitruque foi ótimo !!!
Dox
Eu cheguei para deleteCtl + u em Zsh
Timo
11
Isso é implementado pela biblioteca readline. Outros atalhos podem ser encontrados em sua documentação.
Spidey
28

O meu favorito é CTRL+ Pentão CTRL+O

Isso funciona por padrão, nenhuma configuração extra é necessária. ^ P permitirá que você alterne para o último comando e ^ O permitirá que você execute a linha atual

Observe que CTRL+ Opode ser usado quantas vezes você quiser

margarida
fonte
2
^ O não faz nada no meu Mac.
Snowcrash
11
@Snowcrash Try^J
daisy
que apenas ecoa uma linha em branco, mesmo que eu tenha feito uma lsou pwdanteriormente.
Snowcrash
@Snowcrash É ^ P e ^ J ...
daisy
Ctrl + P não funciona no HP-UX (não sei qual shell ele está usando). A solução alternativa é invocar o `zsh '.
Peter Mortensen
15

Certo! Já que você está acostumado a vicombinações de teclas, por que não configurar seu shell para responder a elas? Para bash, coloque isso em seu ~/.inputrc:

set editing-mode vi

As instâncias em execução do bash não relerão o arquivo; portanto, efetue logout e logon novamente.

zshaté detectará isso para você: se nenhum dos seus scripts de inicialização forçar o modo de edição de uma maneira ou de outra, bindkey e se sua $EDITORvariável de ambiente for detectada vi, ela viativará automaticamente as combinações de teclas. Se você precisar forçá-lo, coloque isso em seu ~/.zshrc:

bindkey -v

Depois disso, utilizar ESCcomo habitual para entrar linha de comando e de ke jpara mover para cima e para baixo.

TAMBÉM : As ligações de shell padrão na maioria das conchas são as ligações Emacs, então na verdade Crtl-Pe Ctrl-Njá deve funcionar sem você ter que mudar nada.

Celada
fonte
9

Com qualquer shell POSIX implementação da Portabilidade usuário opção (inclui ksh, zsh, bash, yash), você também pode usar o fccomando:

fc -e : -1

Veja um exemplo:

$ echo "hello"
hello

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

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

fedorqui
fonte
6

Para todos os usuários do Mac iterm2:

Você pode vincular + Ra 0x0C 0x10 0x0d. Isso limpará o terminal e executará o último comando.

iterm 2 principais preferências

Brian Wigginton
fonte
Existe alguma maneira de repetir o último comando sem limpar o terminal?
Luke Davis
Ah, deixa pra lá: para quem estiver lendo isso, para repetir sem limpar o terminal, use 0x10 0x0d(ou seja, omita o 0x0C).
Luke Davis
5

Acho que preciso refazer comandos como superusuário frequentemente, então

sudo !!

refaz o comando anterior como se eu tivesse me lembrado de digitar sudoem primeiro lugar.

Jared Chmielecki
fonte
2
Eu realmente gosto disso, também parece uma boa resposta à "autorização negada". "Eu quis dizer sudo ffs!"
Viktor Mellgren 01/08/19
3

O kshshell tem um alias padrão rque repete o comando mais recente. Está vinculado a fc -s:

alias r='fc -s'

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

Um alias útil para usar com isso é r='fc -s', para que digitar r cc execute o último comando começando com cce digitando rreexecute o último comando.

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

No zshshell, há um rbuilt-in documentado para ser o mesmo que fc -e -.

O fcutilitário é um utilitário padrão do POSIX .

Kusalananda
fonte
2

Com cshou qualquer shell implementação csh-como história de substituição ( tcsh, bash, zsh), você também pode usar a !<beginning of command>chamar o último comando começando com <beginning of command>.

por exemplo, se você correu

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

!ta executaria tail file.txt

Dan
fonte
1

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

Na verdade, existem 2 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 essencialmente apenas anexando 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"
Pradyumna Shembekar
fonte
+1 para vi `!!`. Muito útil
le_daim 12/08
0

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

Bernard Perrin
fonte
0

você pode usar !npara executar o enésimo comando no terminal. onde 'n' é a linha de historycomando não.

Ravi Sevta
fonte
Qual shell se expande !?para o último comando? Tem certeza de que não está misturando !!(o que já foi abordado em outras respostas)?
Anthony Geoghegan
desculpe, na verdade eu estava experimentando esse comando naquele momento. verifique a resposta editada. @AnthonyGeoghegan
Ravi Sevta
Esse era o atalho que eu estava procurando. Obrigado!
le_daim 12/08
0
  • Digite History e observe o número na frente do comando que você deve executar e usar !number

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

  • ! -2 (segundo último e assim por diante)
Lovish
fonte
0

Existem várias camadas nas quais você pode solicitar o último comando.

Editor de linha

O editor de linha (onde você digita seus comandos) é fornecido diretamente pelo ksh, pela linha de leitura da biblioteca no bash e pela biblioteca zle no zsh. Outros shells, como o dash, podem não ter uma biblioteca de edição para entender essas chaves (a menos que compiladas com a --with-libeditopção ativada).

Este trabalho em ksh, bash, zsh:

Ctrl- P# Modo Emacs (anterior)
Ctrl- N# Modo Emacs (próximo)
ESC- k # vi modo ESC para ir para o modo de comando ek para cima
ESC- j # vi modo ESC para ir para o modo de comando ej para baixo

história

O sistema de histórico fornecido por muitos shells permite a expansão de alguns atalhos:

!!    # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1   # bash and zsh only

comandos

Existem alguns comandos capazes de recuperar comandos do histórico.

Como o comando bastante detalhado (apenas para imprimir):

history 2 | head -n-1

ou o comando mais antigo e, portanto, geralmente mais portátil fc(reexecuta diretamente):

fc -e - -1

Ou talvez o mais simples fc -s -1, mas o zsh não aceita essa opção para fc.

Se você quiser apenas imprimir o comando, use: fc -nl -1 -1.

Para editar, definido FCEDITpara um editor de texto (ex, ed, emacs, vi, etc.) e usar fc diretamente: fc -1.

Isaac
fonte