Wie bearbeite ich vorherige Zeilen in einem mehrzeiligen Befehl in Bash?

24

Wie bearbeite ich vorherige Zeilen, wenn ich einen Befehl eingebe, der sich über mehrere Zeilen in Bash erstreckt? Ich bin ein Linux Mint (Lisa) Benutzer, der GNOME Terminal verwendet.

Nehmen wir zum Beispiel an, ich tippe:

$ echo "foo bar
> baz
>

Und wenn ich dann im Begriff bin, die dritte Zeile des Befehls einzugeben, wird mir plötzlich klar, dass "foo" und "bar" in getrennten Zeilen stehen sollen. Wie würde ich meinen Cursor zwischen "foo" und "bar" neu positionieren, sodass ich die Eingabetaste drücken und sie in separate Zeilen setzen könnte?

(Es ist nicht einfach, wie Sie vielleicht denken. Der Aufwärtspfeil funktioniert nicht und Strg-P ​​auch nicht. Probieren Sie es also bitte vor dem Posten aus! Danke!)

Asher Walther
quelle
Die akzeptierte Antwort besagt, dass es keine Lösung gibt, aber es gibt. Siehe unten
cdosborn

Antworten:

16

Das liegt leider an bash, nicht am Terminal. Ihre Möglichkeiten sind:

  1. Verwenden Sie Semikolons anstelle von Zeilenumbrüchen, obwohl Sie auch dann nicht gleichzeitig eine Bildschirmzeile nach oben bewegen können, sondern Zeichen- oder Wortbewegungsbefehle verwenden müssen. (Seltsamerweise zshkönnen Sie sich zumindest innerhalb eines zusammengesetzten Befehls bewegen, wenn Sie den Verlauf bearbeiten, jedoch nicht innerhalb des aktuellen Befehls.) Manchmal fc(wodurch Sie mit dem vorherigen Befehl in Ihren Editor geworfen werden) ist der Umgang mit zusammengesetzten Befehlen am einfachsten.

  2. Wenn Sie Bash verwenden, verwenden Sie die folgende Tastenkombination:

    ctrl x e

    Es öffnet den Befehl, an dem Sie mit Ihrem Texteditor arbeiten. Speichern Sie die Datei und beenden Sie sie. (Ich habe den Befehl in der Präsentation von Shell Hater gefunden .) Zsh-Benutzer haben diese Alternative .

Geekosaurier
quelle
1
Die bash-Manpage erklärt, wie Sie den verwendeten Editor ändern: edit-and-execute-command (C-xC-e) - Rufen Sie einen Editor in der aktuellen Befehlszeile auf und führen Sie das Ergebnis als Shell-Befehle aus. Bash versucht, $ VISUAL, $ EDITOR und Emacs in dieser Reihenfolge als Editor aufzurufen.
Matthew
Es gibt eine Lösung, ohne den Editor zu öffnen.
cdosborn
Technisch liegt es nicht an bash - sondern an der "readline" -Bibliothek, mit der bash Eingaben abruft.
Christian Herenz
11

Die Lösung besteht darin, erst dann einen Befehl einzugeben, wenn die Mehrfachzeile richtig ist. Geben Sie einfach Folgendes ein: ein, CtrlvCtrlj wenn Sie zur nächsten Zeile wechseln möchten. Metabein Wort zurückgehen.

Lösung

Dank an @ ricis Antwort

cdosborn
quelle
4

Lustigerweise Ctrl+Cist es das , wonach Sie suchen.

wenn du dran bist

$ echo "foo bar
> baz
>

Drücken Sie einfach Ctrl+C(bearbeitete Befehlszeile wird angehalten) und dann Up(Vorgeschichte). Ihre Eingabeaufforderung lautet: (Beachten Sie das Fehlen von>)

$ echo "foo bar
baz

Jetzt können Sie sich Left Rightauch durch Liniensprünge bewegen .

Es gibt nur eine Besonderheit. Sie müssen sich auf dem letzten Zeichen befinden, um eine weitere Zeile hinzuzufügen. Bewegen Sie sich also umher, um vorhandene Zeilen zu bearbeiten (beginnen Sie mit Ctrl+A) und drücken Sie, Enter wenn dies ausreicht, oder gehen Sie zu end ( Ctrl+E), um weitere Zeilen hinzuzufügen Enter. Ein weiterer Nachteil ist, dass durch das Ctrl+_Rückgängigmachen nur die letzten Änderungen wiederhergestellt werdenCtrl+C

albfan
quelle
-2

Kopieren Sie die Befehle, fügen Sie sie in den Editor ein und formatieren Sie sie von dort aus. Danach können Sie Ihre Befehle zurück in das Terminal kopieren.

Pacheko
quelle