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


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"


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


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.


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.

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.