Come ripeto l'ultimo comando senza usare i tasti freccia?


115

So che posso usare Upper scorrere i comandi precedenti. L'esecuzione dell'ultimo comando implica semplicemente Up+ Enter. Tuttavia, stavo pensando di acquistare la tastiera Happy Hacking mentre trascorro molto tempo vim.

Questa tastiera non ha i tasti freccia e l'unico modo in cui so come ottenere questo tipo di comportamento è premendo Ctrl+ Re cominciando a ripetere il mio comando precedente.

Esiste un modo semplice per emulare Up+ Enterin un terminale UNIX senza i tasti freccia?


1
È necessario sostituire il tag del terminale con la shell che si utilizza.
Cristian Ciupitu,

2
@ illuminÉ no mouse ...
quant

Happy Hacking Keyboard non è stato sospeso nel 2006?
Peter Mortensen,

@PeterMortensen no è ancora disponibile. Potresti riferirti alla prima versione, ma i modelli più recenti continuano a essere disponibili.
quant

Risposte:


164

Con csho qualsiasi guscio attuazione cshlike sostituzione storia ( tcsh, bash, zsh):

!!

Poi Enter.


O in alternativa :

!-1

Poi Enter.


O Ctrl+ P,Enter


Spazio magico

Si noti inoltre che !!e !-1non auto-espansione per te, fino a quando non li esegue (quando potrebbe essere troppo tardi).

Se si utilizza bash, si può mettere bind Space:magic-spacein ~/.bashrc, quindi premendo Spacedopo il comando sarà auto-ampliarli in linea, che consente di ispezionare loro prima dell'esecuzione. Ciò è particolarmente utile per l'espansione della cronologia da un comando eseguito qualche tempo fa, ad es. !echoTirerà l'ultimo comando a partire da echo. Con lo spazio magico, puoi visualizzare l'anteprima del comando prima che venga eseguito.

Questo è l'equivalente di fare bindkey ' ' magic-spacein tcsho zsh.


1
@Arman Lieto di aiutarti. Ci sono molti comandi di espansione della cronologia; il link ne elenca alcuni. Ho modificato alcune informazioni sullo spazio magico che potrebbero aiutare con l'uso di alcuni di questi.
Sparhawk,

3
magic-spacequesta è un'opzione dolce!
fduff,

1
C'è anche l' histverifyopzione per la shoptquale readline eseguirà l'espansione della cronologia ma non eseguirà il comando alla prima pressione del tasto Invio. Ciò ti consentirà di valutare il risultato e decidere se è quello che vuoi eseguire.
Etan Reisner,

2
Non ho mai capito perché !! è usato molto più di CTRL-P. CTRL-P ti consente di vedere il comando prima di eseguirlo - e puoi persino modificarlo. Mi sento sempre come se stessi lanciando i dadi con !!.
abonet

1
@abonet Un altro uso che ho appena trovato !!è usare la sua espansione sul posto . Per esempio sudo !!.
Sparhawk,

50

La maggior parte delle shell che dispongono di una funzione di modifica della riga di comando supportano le associazioni dei tasti Emacs. (un piccolo sottoinsieme)

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

In alternativa, è possibile impostare la shell per utilizzare la modalità di modifica del comando vi, aggiungendo set -o vial file di avvio della shell (ad es ~/.bashrc.). Quindi, ad esempio, puoi

  • Utilizzare EsckEnter per rieseguire il comando precedente (uguale a !!). Il tasto meno -funziona anche come comando "sposta su".
  • Utilizzare EsckkkkkkkkkkkkEnter o Esc12kEnter per rieseguire il dodicesimo comando precedente (uguale a !-12).
  • Usa Esce un comando di movimento (cioè, kopportunamente ripetuto), quindi modifica la riga di comando bash che trovi lì. Ricordate, si sarà ancora in vimodalità di comando, quindi sarà necessario utilizzare un vicomando di modifica (ad esempio, I, A, C, R, o uno dei loro omologhi minuscole) per aggiungere in realtà al comando dalla storia.
    Quindi, per esempio, EsckisudoSpaceEnterequivale a sudo !!.
  • Per utenti esperti: puoi persino copiare ( y ank) il testo da una riga e incollarlo ( p ut) su un altro, in modo da ottenere risultati comparabili a !-2:- !$. (Sfortunatamente, non sembra supportare i buffer con nome.)

Sapevo della relazione di Emacs con il terminale ... ma il vitrucco è stato fantastico !!!
Dox,

Ho ricevuto deleteCtl + u in Zsh
Timo l'

1
Questo è implementato dalla libreria readline. Ulteriori scorciatoie possono essere trovate sulla sua documentazione.
Spidey,

28

Il mio preferito è CTRL+ Pquindi CTRL+O

Funziona di default, non è necessaria alcuna configurazione aggiuntiva. ^ P ti consentirà di passare all'ultimo comando e ^ O ti consentirà di eseguire la riga corrente

Nota che CTRL+ Opuò essere usato per tutte le volte che vuoi


2
^ O non fa nulla sul mio Mac.
Snowcrash,

1
@Snowcrash Try^J
daisy

che fa eco a una riga vuota anche se ne ho fatto uno lso in pwdprecedenza.
Snowcrash,

@Snowcrash È ^ P poi ^ J ...
margherita

Ctrl + P non funziona su HP-UX (non so quale shell stia usando). La soluzione è di invocare `zsh '.
Peter Mortensen,

15

Sicuro! Dato che sei abituato alle vicombinazioni di tasti, perché non configurare la shell per rispondere ad esse? Per bash, mettilo nel tuo ~/.inputrc:

set editing-mode vi

L'esecuzione di istanze di bash non rileggerà il file, quindi disconnettersi e riconnettersi.

zshlo rileverà anche per te: se nessuno dei tuoi script di avvio impone la modalità di modifica in un modo o nell'altro bindkey e se la tua $EDITORvariabile di ambiente viene rilevata per contenere vi, allora abiliterà automaticamente le vicombinazioni di tasti. Se devi forzarlo, inseriscilo nel tuo ~/.zshrc:

bindkey -v

Successivamente, utilizzare ESCcome di consueto per immettere linea di comando e ke jper muoversi su e giù.

ANCHE : I bind di shell predefiniti nella maggior parte delle shell sono i bind emacs, quindi in realtà Crtl-Pe Ctrl-Ndovrebbero già funzionare senza che tu debba cambiare nulla.


9

Con qualsiasi shell POSIX attuazione della portabilità utente opzione (include ksh, zsh, bash, yash), è anche possibile utilizzare il fccomando:

fc -e : -1

Vedi un esempio:

$ echo "hello"
hello

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

Maggiori informazioni in Esegui una serie di comandi dalla risposta della storia di Jonathan Leffler.


6

Per tutti gli utenti Mac iterm2:

Puoi associare + Ra 0x0C 0x10 0x0d. Questo cancellerà il terminale ed eseguirà l'ultimo comando.

Preferenze chiave di iterm 2


C'è un modo per ripetere l'ultimo comando senza cancellare il terminale?
Luke Davis,

Ah, non importa: per chiunque legga questo, per ripetere senza cancellare il terminale, usare 0x10 0x0d(cioè omettere il 0x0C).
Luke Davis,

5

Trovo di dover ripetere i comandi come superutente spesso, quindi

sudo !!

ripristina il comando precedente come se mi fossi ricordato di digitare sudoper primo.


2
Mi piace molto, sembra anche una buona risposta a "autorizzazione negata". "Intendevo sudo ffs!"
Viktor Mellgren,

3

La kshshell ha un alias predefinito rche ripete il comando più recente. È tenuto a fc -s:

alias r='fc -s'

È interessante notare che la bashdocumentazione per il fcbuiltin ( help fce anche nel manuale stesso) menziona anche questo, ma non è un alias predefinito in quella shell:

Un utile alias da utilizzare con questo è r='fc -s', in modo che la digitazione r cc esegua l'ultimo comando che inizia con cce digitando rriesegue l'ultimo comando.

In bash, questo funzionerebbe anche anche se hai disattivato le espansioni della cronologia set +H.

Nella zshshell, c'è un rbuiltin che è documentato come fc -e -.

L' fcutilità è un'utilità POSIX standard .


2

Con csho qualsiasi guscio attuazione csh-come storia sostituzione ( tcsh, bash, zsh), è anche possibile utilizzare il !<beginning of command>per richiamare l'ultimo comando che inizia con <beginning of command>.

per esempio se hai corso

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

!ta avrebbe eseguito tail file.txt


1

tl; dr !!aggiunge solo l'ultimo comando al comando corrente. <backtick>!!<backtick> esegue l'ultimo comando e accoda l'output al comando corrente.

Esistono in realtà 2 varianti:

  1. L'ultimo comando stesso
  2. Il risultato dell'ultimo comando

Lascia che ti mostri 2 esempi:

Esempio 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Come vedi sopra, sto eseguendo un comando e essenzialmente aggiungo solo l'ultimo comando.

Un'altra variazione

Esempio 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"

+1 per vi `!!`. Molto utile
le_daim il

0

Quando sto usando un buon emulatore xterm, ad esempio putty, il mio modo preferito di procedere è selezionare il comando incluso il feed di linea, copiarlo negli appunti e quindi usare il tasto destro del mouse per incollarlo. Questo ripete il comando con un solo clic. Questo funziona bene anche per una sequenza di comandi separati da punti e virgola.


0

è possibile utilizzare !nper eseguire l'ennesimo comando nel terminale. dove 'n' è la riga no del historycomando.


Quale shell si espande !?all'ultimo comando? Sei sicuro di non confonderlo con !!(che è già stato trattato in altre risposte)?
Anthony Geoghegan,

scusa, in realtà stavo sperimentando questo comando in quel momento. controlla la risposta modificata. @AnthonyGeoghegan
Ravi Sevta

Questa era la scorciatoia che stavo cercando. Grazie!
le_daim,

0
  • Digita Cronologia e annota il numero davanti al comando che devi eseguire e usare !number

  • Puoi anche usare ! -1 (1 essendo l'ultimo comando che esegui, sostituiscilo con il numero di conteggio che ottieni quando lo fai dal basso mantenendo l'ultimo eseguito come 1)

  • ! -2 (penultimo e così via)

0

Esistono diversi livelli in cui è possibile richiedere l'ultimo comando.

Editor di linee

L'editor di linea (dove digiti i tuoi comandi) è fornito direttamente da ksh, dalla libreria readline in bash e dalla libreria zle in zsh. Altre shell, come il trattino, potrebbero non avere una libreria di modifica per comprendere queste chiavi (a meno che non sia compilata con l' --with-libeditopzione abilitata).

Questo lavoro in ksh, bash, zsh:

Ctrl- P# Modalità Emacs (precedente)
Ctrl- N# Modalità Emacs (successiva)
ESC- k Modalità # vi ESC per andare in modalità comando e k per su
ESC- j # Modalità vi ESC per andare in modalità comando e j per giù

storia

Il sistema di cronologia fornito da molte shell consente l'espansione di alcune scorciatoie:

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

comandi

Ci sono alcuni comandi che sono in grado di recuperare i comandi della cronologia.

Come il comando abbastanza dettagliato (solo per stampare):

history 2 | head -n-1

o il comando più vecchio e quindi solitamente più portatile fc(riesegue direttamente):

fc -e - -1

O forse il più semplice fc -s -1, ma zsh non accetta tale opzione per fc.

Se si desidera solo stampare il comando, utilizzare: fc -nl -1 -1.

Per modificare, impostare FCEDITad un editor di testo (ad esempio, a cura di, Emacs, VI, ecc) e utilizzare fc direttamente: fc -1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.