Ausführen einer Subshell ab der Mitte des aktuellen Befehls

16

Ich finde mich häufig in diesem Szenario wieder. Ich bin mitten in der Eingabe eines Befehls und muss noch etwas überprüfen, bevor ich ihn abschließe.

Gibt es eine Möglichkeit, eine Subshell zu öffnen, bei der meine aktuellen Eingaben bisher gespeichert wurden? Wenn ich diese Subshell beende, bin ich wieder da, wo ich war.

$ mylongcommand -n -e <SOME KEY COMBINATION WHICH OPENS A SUBSHELL>
$ date
...
$ exit
$ mylongcommand -n -e <BACK TO WHERE I WAS>

Ich benutze zsh

Panayiotis
quelle
2
Warum nicht einfach ein anderes Terminalfenster öffnen?
Barmar
@Barmar Für mich benutze ich auf den meisten meiner Linux-Systeme keine GUI, daher müsste ich die TTYs wechseln. Das bedeutet, dass ich mich erneut authentifizieren muss. Die folgenden Optionen sind viel effizienter.
Zachary Brady
3
Sie können screenoder verwenden tmux, um mehrere virtuelle Terminals auf der Konsole abzurufen.
Barmar

Antworten:

16

Es gibt die Tastenkombination, EscQdie den Befehlspuffer speichert und die Eingabe eines neuen Befehls ermöglicht. Nach dem Ausführen des Befehls enthält der Puffer das, was Sie zuvor eingegeben haben. Wenn Sie einen anderen Befehl ausführen müssen, bevor Sie dies beenden, können Sie ihn EscQerneut eingeben.

(Ich habe noch nicht versucht, eine Subshell zu öffnen, nachdem ich gedrückt EscQhabe.)

Siehe http://zsh.sourceforge.net/Intro/intro_10.html und suche nach "esc-q"

Bodo
quelle
Genau das, was ich wollte, vielen Dank! Ich könnte dafür sorgen, dass es eine verschachtelte Shell ausführt, anstatt sofort zurückzukehren, aber für meinen Anwendungsfall funktioniert das sofortige Zurückkehren perfekt.
Panayiotis
19

Normalerweise verwende ich Ctrl+, Uwodurch die aktuelle Zeile gelöscht und in einem Puffer gespeichert wird. Von dort aus mache ich, was immer ich vor dem brauchte mylongcommand. Wenn ich fertig bin, benutze ich Ctrl+ Y, mylongcommandum meine Eingabeaufforderung wieder einzufügen.

Denken Sie an einen halb getippten Befehl, während ich etwas überprüfe

Zachary Brady
quelle
7

Meine Lösung ist ausgesprochen Low-Tech und klobig, sondern stützt sich auf Schlüssel-Sequenzen sind Sie wahrscheinlich bereits vertraut mit: Hit Ctrl+ A, dann #, dann ENTER.

Dies hat zur Folge, dass #am Anfang der Zeile ein eingefügt wird, so dass daraus ein Kommentar wird, der dann ausgeführt und in den Befehlsverlauf verschoben wird. Sie können dann Ihren Hilfsbefehl eingeben, durch den Befehlsverlauf zum kommentierten Befehl blättern, den Befehl entfernen #und den Befehl nach Bedarf ausführen.

Digitales Trauma
quelle
Sie sollten die "Home" -Taste auf Ihrer Tastatur drücken, es spart 1 Tastendruck und die Energie, die erforderlich ist, um es tatsächlich zu drücken
Ferrybig
@Ferrybig - ja, das ist gut, obwohl meine tägliche Tastatur ein MacBook Pro ist, das keine HOME- Taste hat. Das HOME- Äquivalent ist FN + PFEIL LINKS , aber das scrollt bis zum oberen Rand des Terminals.
Digitales Trauma
2

Ich gebe Ctrl+ ein Z, um den Befehl, den ich eingebe, auszusetzen, und gebe einen anderen Befehl ein. Nachdem ich diesen Befehl ausgeführt habe (oder ihn mit Ctrl+ abgebrochen habe C), wird der angehaltene Befehl zur Bearbeitung zurückgegeben (auch wenn ich mich an die Cursorposition erinnere). Wenn die Befehlszeile bei der Eingabe von Ctrl+ leer ist Z, ruft die Taste bgstattdessen die integrierte Funktion auf (ein doppeltes Ctrl+ Zsendet also einen ausgeführten Befehl direkt in den Hintergrund).

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

(Früher veröffentlicht unter Remember a half-typed command, während ich etwas überprüfe, das hauptsächlich Lösungen für Bash enthält, bei denen Sie nichts so Bequemes tun können. Dies ist eine etwas schickere Version der eingebauten Bindung von M-qtopush-line .)

Dies führt keine Subshell aus: Der Befehl, den Sie eingeben, nachdem Sie die vorherige "angehalten" haben, wird in derselben Shell ausgeführt. Auf diese Weise können Sie beispielsweise das aktuelle Verzeichnis ändern, wenn Sie nach der Eingabe eines Befehls feststellen, dass Sie es in einem anderen Verzeichnis ausführen möchten. Wenn Sie eine neue Shell-Instanz ausführen möchten, können Sie diese zshüber eine Schlüsselbindung ausführen , aber ich halte das nicht für besonders nützlich.

Gilles 'SO - hör auf böse zu sein'
quelle