Ich befinde mich oft in der folgenden Position: Ich habe begonnen, einen langen Befehl an der Bash-Eingabeaufforderung einzugeben, aber nach der Hälfte der Zeit muss ich herausfinden, dass ich etwas mit einem anderen Befehl überprüfen muss. Dies ist ein Problem, wenn ich an der Konsole bin (kein X), was häufig der Fall ist, da ich dann nur die folgenden unbefriedigenden Möglichkeiten habe, dies zu tun, die mir bekannt sind:
- Drücken Sie ctrl+ alt+ F2und melden Sie sich an einer anderen virtuellen Konsole an, und finden Sie heraus, was ich wollte. Gehen Sie dann zurück und fahren Sie fort
- ctrl+ a, tippe echo + space+ enter, finde heraus, was ich wollte, drücke ↑bis ich meinen Befehl finde, ctrl+ a, delx 5, ctrl+ eund fahre fort
- Markieren Sie, was ich bisher mit der Maus eingegeben habe (wenn gpm ausgeführt wird, was normalerweise der Fall ist), drücken Sie ctrl+ c, um die Eingabe zu unterbrechen, und finden Sie heraus, was ich wollte Klicken Sie auf eine neue Eingabeaufforderung und fahren Sie fort
- Bete an die Befehlszeilengötter, dass der halb geschriebene Befehl keine nachteiligen Auswirkungen hat, sondern einfach fehlschlägt. Drücke vorsichtig die Eingabetaste, finde dann heraus, was ich wollte, drücke den oberen Pfeil, bis ich meinen Befehl wieder erhalte, und fahre fort
- Springe in meine Zeitmaschine, reise zurück in die Zeit und erinnere mich daran, den Bildschirm zu starten, bevor ich mit der Eingabe von Befehlen beginne, gehe zurück in die Gegenwart, drücke ctrl+ a c, finde heraus, was ich wollte, drücke ctrl+ a ctrl+aund fahre fort
Was ich wissen möchte ist, gibt es eine elegantere Art, dies zu tun? Eine Art Subshell-Befehl oder ähnliches?
Ich interessiere mich am meisten für Methoden, die keine Vorbereitung oder Einrichtung erfordern, um zu funktionieren.
quelle
zsh
sie die gesamte Linie nicht schneidet, sondernbash
schneidet sie nach hinten. Ich habe diesen Unterschied noch nie bemerkt^U
^K
hat den gleichen Effekt wie^A
^K
, ist aber geringfügig ergonomischer und deutlich bequemer unterscreen
.Drücken Sie Strg-A, um zum Zeilenanfang zu gelangen, stellen Sie einen Hash voran und drücken Sie die Eingabetaste. Auf diese Weise bleibt er als Kommentar im Befehlsverlauf und Sie können mit dem Cursor nach oben dorthin zurückkehren
BEARBEITEN: habe gerade bemerkt, dass dies eine etwas elegantere Variante auf deiner # 2 ist;)
quelle
csh
oder nicht funktioniert,zsh
da Kommentare in der interaktiven Shell nicht zulässig sind. Inzsh
Sie müssen die richtige Option aktivieren:setopt interactive_comments
.:
sollte für diesen Zweck als schädlich angesehen und niemals vorgeschlagen werden. Es wird alles nach einem Semikolon, in Backticks usw. mit allen damit verbundenen Nebenwirkungen ausgeführt.Drücken Sie
Ctrl+A
,Ctrl+K
um an den Zeilenanfang zu gelangen und bis zum Ende zu löschen (töten). Dann recherchieren Sie, und wenn Sie bereit sind, weiterzuschlagenCtrl+Y
, um Ihre gerettete (getötete) Linie zurückzusetzen.quelle
In zsh gebe ich Ctrl+ ein Z, um den Befehl, den ich eingebe, auszusetzen und einen anderen Befehl einzugeben. 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
bg
stattdessen die integrierte Funktion auf (ein doppeltes Ctrl+ Zsendet also einen ausgeführten Befehl direkt in den Hintergrund).Ich weiß nicht, wie ich etwas Ähnliches in Bash machen soll.
In jeder Shell können Sie die Low-Tech-Methode zum Hinzufügen von a
#
am Anfang der aktuellen Zeile verwenden .quelle
zsh
eine Funktion dafür eingebaut ist ? Es heißtpush-line
und alles, was Sie tun müssen, ist es zu benutzenbindkey
, um es zu erreichen.push-input
eher benutze alspush-line
hier,push-line
scheint das passender zu sein (vielleicht hatten nur alte Versionen von zshpush-input
?). Dies ist jedoch kein Ersatz für den Rest der Funktion.push-line
ist nutzlos auf eine leere Zeile, mitbg
aufCtrl+Z
nur sinnvoll ist , wenn ich nur diesen Prozess mit suspendiertem habenCtrl+Z
) und mnemonic (Ich bin entweder Hintergrund versetzen, den Prozess oder die teilweise Befehlszeile).push-input
den gesamten Eingabepuffer an, währendpush-line
nur die aktuelle Zeile angehalten wird. Wenn ich einen mehrzeiligen Befehl eingebe, möchte ich den gesamten Befehl aussetzenpush-input
. Ich findepush-input
es häufiger nützlich alspush-line
(wenn ich eine Zeile in einem mehrzeiligen Eingabepuffer verzögern möchte, kann ich einfach zum Zeilenanfang navigieren und eine neue Zeile einfügen), also frage ich mich tatsächlich, warumpush-line
die Standard-Tastenkombination verwendet wurde und nichtpush-input
.Geben Sie in bash einfach Alt+ ein #.
Wenn Sie fertig sind, drücken Sie Updann Alt+ #.
Das erste setzt ein
#
am Zeilenanfang, um daraus einen Kommentar zu machen, und akzeptiert dann die Zeile, als hätten Sie gedrückt Enter.Wenn Sie es dann ein zweites Mal tun, sieht es, dass die Linie bereits ein
#
am Anfang hat, so dass es sie entfernt und akzeptiert und Ihnen den EnterSchlüssel wieder speichert .Wenn das zweite Mal , andere nur einfügt
#
, dann müssen Sie eingeben Alt+ - Alt+ #statt.Sie können zsh dazu bringen, dasselbe zu tun, indem Sie setzen
in Ihrem ~ / .zshrc.
Wenn Sie vi-Bindungen verwenden, können Sie im #Befehlsmodus sowohl bash als auch zsh eingeben.
quelle
Esc+1
dannAlt
+#
zu wechseln.Eines meiner Lieblingsfeatures
zsh
ist die integrierte Push-Line-Funktion, die dies erledigt, ohne dass die anderen Antworten hacken. Ich habe es gebunden an Ctrl+ lin meiner.zshrc
Datei wie folgt:Wenn ich dann einen Befehl eingebe und ganz schnell etwas anderes tun muss, kann ich das mit einer Taste aufrufen und eine leere Eingabeaufforderung erhalten. Nachdem Sie den anderen Befehl ausgeführt haben, wird die Eingabeaufforderung automatisch mit dem ausgefüllt, was ich zuvor eingegeben habe.
Sie können sogar mehrere Ebenen davon verketten, und die Befehle werden in umgekehrter Reihenfolge an Sie zurückgegeben, in der Sie sie in die Warteschlange gestellt haben.
quelle
Ctrl+Q
undESC q
standardmäßig (im Emacs-Modus).push-line-or-edit
Widget erwähnen , das standardmäßig nicht an eine Keymap gebunden ist. Bei der Eingabeaufforderung der obersten Ebene wird das Gleiche getan wiepush-line
bei der Eingabeaufforderung der unteren Ebene wird jedoch der gesamte eingegebene Befehl in einen mehrzeiligen Puffer konvertiert. Zwei großartige Funktionen auf einer Tastenkombination! Ich kann das Bindenpush-line-or-edit
statt des Einfachen empfehlenpush-line
. Sie verlieren nichts und erhalten nützliche Funktionen.Neben den ctrl- a ctrl- kTrick, wenn man im Bildschirm ist, nur ctrl- a dlösen dann wieder anbringen mit
screen -r
Sie können auch einfach ein anderes Fenster mit ctrl+ öffnena c
quelle
Ctrl+A c
.Eine alternative, aber nicht perfekte Möglichkeit, drücken Sie
Ctrl-X
Ctrl-E
. Dadurch wird Ihr Standardeditor geöffnet, der Ihren halb getippten Befehl enthält. Anschließend können Sie Ihren Befehl in einer Datei speichern oder eine neue Shell in Ihrem Editor öffnen. Wenn Sie die neue Shell verlassen, kehren Sie zum Editor zurück und werden beim Speichern des Inhalts automatisch ausgeführt.Dies ist nicht perfekt, da Sie nicht zu Ihrer ursprünglichen Shell zurückkehren, sondern die Ausführung des Befehls erzwingen oder ihn vollständig verwerfen. Es gibt jedoch keine vorübergehenden Auswahlen oder Löschpuffer, über die Sie sich Sorgen machen müssen, und es gibt auch einige nette Verbesserungen, z. B. wenn editor = vi
quelle
sudo update-alternatives --config editor
und wähle deinen Lieblingseditor. Für andere Systeme stellen Sie die Umgebungsvariablen EDITOR oder VISUAL auf Ihren bevorzugten Editor ein, z. B. fügen Sieexport EDITOR=/usr/bin/nano
Ihre .bashrc hinzu.Ähnlich wie beim Hinzufügen
#
am Zeilenanfang gibt es eine wohl einfachere Methode, bei der ich nicht zum Zeilenanfang zurückkehren muss:Fügen Sie einfach ein offenes Zitat hinzu und schließen Sie es nicht, egal ob einzeln oder doppelt.
Dann drücken Sie Enter.
Dann drücken Sie CtrlC.
Der Teilbefehl wird in der Befehlshistorie gespeichert (verfügbar über den Aufwärtspfeil), jedoch nicht ausgeführt.
quelle
Wenn Sie zsh eingeben
<ESC> q
(Escape, dann Q), wird Ihre Eingabeaufforderungszeile abgeschnitten, sodass Sie einen anderen Befehl eingeben können. Sie erhalten Ihren ausgeschnittenen Text bei der nächsten Aufforderung automatisch zurück.Es kann sich an mehrere Leitungen gleichzeitig erinnern, sodass Sie es verwenden können, während eine Leitung auf Sie wartet. Sie können es sogar für Leerzeilen verwenden, um die Fortsetzung Ihrer Schnittlinie zu verzögern.
Dies ist nicht die effizienteste Methode, wenn Sie mehrere Befehle für die Prüfung / Vorbereitung verwenden müssen (Sie müssen
<ESC> q
vor jedem Befehl einen neuen eingeben ). Aber ich denke, dass es möglich ist, es an eine kürzere Verknüpfung zu binden.Wenn Sie nur das Handbuch überprüfen möchten, geben Sie
<ESC> h
(Escape, dann H) ein. Das führt dasrun-help
eingebaute aus, mit dem ersten Wort der Befehlszeile als Argument. Sobald Sie fertig sind, finden Sie Ihre Leitung wieder.quelle
M-q
statt<ESC> q