Wie wiederhole ich den letzten Befehl ohne die Pfeiltasten zu verwenden?


115

Ich weiß, dass ich damit Upfrühere Befehle durchlaufen kann. Das Ausführen des letzten Befehls umfasst einfach Up+ Enter. Ich dachte jedoch darüber nach, das Happy Hacking Keyboard zu kaufen, da ich viel Zeit damit verbringe vim.

Diese Tastatur hat keine Pfeiltasten, und ich weiß nur, wie ich diese Art von Verhalten erreichen kann, indem ich Ctrl+ drücke Rund beginne, meinen vorherigen Befehl zu wiederholen.

Gibt es eine einfache Möglichkeit, Up+ Enterin einem UNIX-Terminal ohne die Pfeiltasten zu emulieren ?


1
Sie sollten das Terminal- Tag durch die von Ihnen verwendete Shell ersetzen .
Cristian Ciupitu

2
@ illuminÉ keine Maus ...
quant

Wurde Happy Hacking Keyboard 2006 nicht eingestellt?
Peter Mortensen

@PeterMortensen Nein, es ist noch verfügbar. Sie beziehen sich möglicherweise auf die erste Version, die neueren Modelle sind jedoch weiterhin verfügbar.
Quant

Antworten:


164

Mit cshoder jeder Schale Umsetzung csh-ähnlichen Geschichte Substitution ( tcsh, bash, zsh):

!!

Dann Enter.


Oder alternativ :

!-1

Dann Enter.


Oder Ctrl+ P,Enter


Magischer Raum

Beachten Sie auch, dass !!und !-1nicht automatisch erweitert wird, bis Sie sie ausführen (wenn es zu spät sein könnte).

Wenn Sie sie verwenden bash, können Sie sie bind Space:magic-spacein ~/.bashrceinfügen. Durch Drücken von Spaceafter the command werden sie automatisch inline erweitert, sodass Sie sie vor der Ausführung überprüfen können. Dies ist besonders nützlich für die Historienerweiterung nach einer Befehlsausführung vor einer Weile, z. B. !echowird die letzte Befehlsausführung beginnend mit abgerufen echo. Mit Magic Space können Sie eine Vorschau des Befehls anzeigen, bevor er ausgeführt wird.

Das ist das Äquivalent zu tun bindkey ' ' magic-spacein tcshoder zsh.


1
@Arman Bin froh zu helfen. Es gibt eine ganze Reihe von Befehlen zur Historienerweiterung. Der Link listet einige von ihnen auf. Ich habe einige Informationen zum Magic Space bearbeitet, die bei der Verwendung einiger dieser Informationen hilfreich sein könnten.
Sparhawk

3
magic-spaceDas ist eine süße Option!
Fduff

1
Es gibt auch die histverifyOption, mit shoptder readline die Verlaufserweiterung ausführt, den Befehl jedoch nicht beim ersten Drücken der Eingabetaste ausführt. Auf diese Weise können Sie das Ergebnis bewerten und entscheiden, ob Sie es ausführen möchten.
Etan Reisner

2
Ich habe nie verstanden warum !! wird so viel mehr als STRG-P verwendet. Mit STRG-P können Sie den Befehl sehen, bevor Sie ihn ausführen. Sie können sogar Änderungen daran vornehmen. Ich habe immer das Gefühl, ich würfle mit !!.
abonet

1
@abonet Eine andere Verwendung , die ich habe gerade für !!die Expansion verwendet in-place . Zum Beispiel sudo !!.
Sparhawk

50

Die meisten Shells mit einer Befehlszeilen-Bearbeitungsfunktion unterstützen Emacs-Tastenzuordnungen. (Eine winzige Untergruppe)

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

Alternativ können Sie Ihre Shell so einrichten, dass sie den vi-Befehlsbearbeitungsmodus verwendet, indem Sie sie set -o vizu Ihrer Shell-Startdatei hinzufügen (z ~/.bashrc. B. ). Dann können Sie zum Beispiel

  • Verwenden Sie EsckEnter diese Taste, um den vorherigen Befehl (wie !!) erneut auszuführen . Die Minustaste -funktioniert auch als Aufwärtsbefehl.
  • Verwenden Sie EsckkkkkkkkkkkkEnter oder Esc12kEnter , um den 12. vorherigen Befehl erneut auszuführen (genauso wie !-12).
  • Verwenden Sie Escund einen Bewegungsbefehl (dh kentsprechend wiederholt), und bearbeiten Sie dann die Bash-Befehlszeile, die Sie dort finden. Denken Sie daran, werden Sie noch in sein viKommando - Modus, so dass Sie ein verwenden müssen viBearbeitungsbefehl (zB I, A, C, R, oder einer ihrer Kleinbuchstaben) hinzuzufügen , tatsächlich auf den Befehl von der Geschichte.
    So ist zum Beispiel EsckisudoSpaceEntergleichbedeutend mit sudo !!.
  • Für erfahrene Benutzer: Sie können sogar Text aus einer Zeile kopieren ( y ank) und in eine andere einfügen ( p ut), um vergleichbare Ergebnisse zu erzielen !-2:- !$. (Leider scheint es keine benannten Puffer zu unterstützen.)

Ich wusste von der Emacs-Beziehung zum Terminal ... aber der viTrick war großartig !!!
Dox

Ich bekam für deleteCtl + u in Zsh
Timo

1
Dies wird von der readline-Bibliothek implementiert. Weitere Verknüpfungen finden Sie in der Dokumentation.
Spidey

28

Mein Favorit ist CTRL+ Pdann CTRL+O

Dies funktioniert standardmäßig, es ist keine zusätzliche Konfiguration erforderlich. Mit ^ P wechseln Sie zum letzten Befehl und mit ^ O können Sie die aktuelle Zeile ausführen

Beachten Sie, dass CTRL+ Oso oft verwendet werden kann, wie Sie möchten


2
^ O macht auf meinem Mac nichts.
Snowcrash

1
@Snowcrash Try^J
Daisy

das gibt nur eine leere zeile wieder, auch wenn ich schon eine lsoder pwdvorher gemacht habe.
Snowcrash

@Snowcrash Es ist ^ P dann ^ J ...
Gänseblümchen

Strg + P funktioniert unter HP-UX nicht (ich weiß nicht, welche Shell verwendet wird). Die Problemumgehung besteht darin, "zsh" aufzurufen.
Peter Mortensen

15

Sicher! viWarum konfigurieren Sie Ihre Shell nicht so, dass sie darauf reagiert, da Sie an Tastenkombinationen gewöhnt sind? Für bash, geben Sie dies ein in ~/.inputrc:

set editing-mode vi

Das Ausführen von bash-Instanzen liest die Datei nicht erneut, melden Sie sich also ab und wieder an.

zshwird dies sogar für Sie erkennen: Wenn keines Ihrer Startskripte den Bearbeitungsmodus auf die eine oder andere Weise erzwingt bindkey und$EDITOR festgestellt wird, dass Ihre Umgebungsvariable enthält vi, werden die viTastenkombinationen automatisch aktiviert . Wenn Sie es erzwingen müssen, geben Sie Folgendes ein ~/.zshrc:

bindkey -v

Verwenden Sie danach ESCwie gewohnt, um die Befehlszeile einzugeben und sich auf kund ab jzu bewegen.

AUCH : Die Standard - Shell - Bindungen in den meisten Schalen sind die Emacs - Bindungen, also eigentlich Crtl-Pund Ctrl-Nsollen schon funktionieren , ohne dass Sie etwas ändern zu müssen.


9

Mit jedem POSIX - Shell die Implementierung Benutzer Portabilität Option (einschließlich ksh, zsh, bash, yash), können Sie auch die Verwendung fcBefehl ein :

fc -e : -1

Sehen Sie sich ein Beispiel an:

$ echo "hello"
hello

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

Weitere Informationen unter Ausführen einer Reihe von Befehlen aus der Antwort der Historie von Jonathan Leffler.


6

Für alle Benutzer von Mac iterm2:

Sie können + Ran binden 0x0C 0x10 0x0d. Dadurch wird das Terminal gelöscht und der letzte Befehl ausgeführt.

iterm 2 Schlüsselpräferenzen


Gibt es eine Möglichkeit, den letzten Befehl zu wiederholen, ohne das Terminal zu löschen?
Luke Davis

Ah, egal: Wenn Sie dies lesen, ohne das Terminal zu löschen, verwenden Sie 0x10 0x0d(dh lassen Sie das 0x0C) , um es zu wiederholen .
Luke Davis

5

Ich finde, ich muss Befehle als Superuser oft wiederholen, also

sudo !!

Wiederholt den vorherigen Befehl, als hätte ich mich daran erinnert, sudoan erster Stelle etwas einzugeben .


2
Ich mag das wirklich, sieht auch aus wie eine gute Antwort auf "Autorisierung verweigert". "Ich meinte sudo ffs!"
Viktor Mellgren

3

Die kshShell verfügt über einen Standardalias r, der den neuesten Befehl wiederholt. Es ist gebunden an fc -s:

alias r='fc -s'

Interessanterweise wird dies in der bashDokumentation zum fcBuiltin ( help fcund auch im Handbuch selbst) sogar erwähnt, aber es ist kein Standardalias in dieser Shell:

Ein nützlicher Alias, der dabei verwendet werden kann, ist r='fc -s', dass bei der Eingabe r cc der letzte Befehl beginnend mit ccund bei der Eingabe rder letzte Befehl erneut ausgeführt wird.

In bash, würde dies auch noch funktionieren , wenn Sie Geschichte Erweiterungen aus mit eingeschaltet haben set +H.

In der zshShell gibt es ein reingebautes Element, von dem dokumentiert ist, dass es dasselbe ist wie fc -e -.

Das fcDienstprogramm ist ein POSIX-Standarddienstprogramm .


2

Mit cshoder jeder Schale Umsetzung csh-ähnlichen Geschichte Substitution ( tcsh, bash, zsh), können Sie auch die Verwendung !<beginning of command>der letzte Befehl mit beginnen zu nennen <beginning of command>.

Zum Beispiel, wenn du gelaufen bist

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

!ta ausführen würde tail file.txt


1

tl; dr !!hängt nur den letzten Befehl an den aktuellen Befehl an. <backtick>!!<backtick> Führt den letzten Befehl aus und hängt die Ausgabe an den aktuellen Befehl an.

Es gibt eigentlich 2 Varianten:

  1. Der letzte Befehl selbst
  2. Das Ergebnis des letzten Befehls

Lassen Sie mich Ihnen 2 Beispiele zeigen:

Beispiel 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Wie Sie oben sehen, führe ich einen Befehl aus und hänge im Wesentlichen nur den letzten Befehl an.

Eine weitere Variation

Beispiel 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 für vi `!!`. Sehr nützlich
le_daim

0

Wenn ich einen guten xterm-Emulator verwende, z. B. Putty, gehe ich am liebsten so vor, dass ich den Befehl einschließlich Zeilenvorschub auswähle, in die Zwischenablage kopiere und ihn dann mit der rechten Maustaste einfüge. Dies wiederholt den Befehl mit einem einzigen Klick. Dies funktioniert auch für eine Folge von Befehlen, die durch Semikolons getrennt sind.


0

Mit können Sie den !nn-ten Befehl im Terminal ausführen. Dabei steht 'n' für die historyBefehlszeile no .


Welche Shell wird !?bis zum letzten Befehl erweitert? Sind Sie sicher, dass Sie es nicht verwechseln !!(was bereits in anderen Antworten behandelt wurde)?
Anthony Geoghegan

Tut mir leid, eigentlich habe ich diesen Befehl zu dieser Zeit experimentiert. Bitte überprüfe die bearbeitete Antwort. @AnthonyGeoghegan
Ravi Sevta

Dies war die Verknüpfung, nach der ich gesucht habe. Vielen Dank!
le_daim

0
  • Geben Sie History ein und notieren Sie sich die Nummer vor dem Befehl, den Sie ausführen und verwenden möchten !number

  • Sie können auch ! -1 verwenden (1 ist der letzte Befehl, den Sie ausführen. Ersetzen Sie ihn durch die Zählnummer, die Sie erhalten, wenn Sie dies von unten tun, und behalten Sie den zuletzt ausgeführten Befehl bei 1).

  • ! -2 (vorletzter und so weiter)

0

Es gibt mehrere Ebenen, in denen Sie nach dem letzten Befehl fragen können.

Zeileneditor

Der Zeileneditor (in den Sie Ihre Befehle eingeben) wird direkt von ksh, von der Bibliothek readline in bash und von der Bibliothek zle in zsh bereitgestellt. Andere Shells, z. B. Dash, verfügen möglicherweise nicht über eine Bearbeitungsbibliothek, um diese Schlüssel zu verstehen (sofern sie nicht mit --with-libeditaktivierter Option kompiliert wurden ).

Diese Arbeit in ksh, bash, zsh:

Ctrl- P# Emacs-Modus (vorherige)
Ctrl- N# Emacs-Modus (nächste)
ESC- k # vi-Modus ESC zum Wechseln in den Befehlsmodus und k zum Hochfahren
ESC- j # vi-Modus ESC zum Wechseln in den Befehlsmodus und j zum Runterfahren

Geschichte

Das von vielen Shells bereitgestellte Verlaufssystem ermöglicht die Erweiterung einiger Verknüpfungen:

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

befehle

Es gibt einige Befehle, die Verlaufsbefehle abrufen können.

Wie der ziemlich ausführliche Befehl (nur zum Drucken):

history 2 | head -n-1

oder der ältere und daher meist portablere fcBefehl (wird direkt neu ausgeführt):

fc -e - -1

Oder vielleicht die einfachere fc -s -1, aber zsh akzeptiert keine solche Option für fc.

Wenn Sie nur wollen, drucken Sie den Befehl verwenden: fc -nl -1 -1.

So bearbeiten, stellen Sie FCEDITin einen Texteditor (ex, ed, Emacs, vi, etc.) und verwenden fc direkt: fc -1.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.