Mit BASH, nachdem Sie zu einem vorherigen Befehl „gescrollt“ haben… wie kann man dann zum nächsten in dieser Geschichte übergehen?

59

Entschuldigung, dieser Titel ist nicht der eleganteste, den ich je erfunden habe.

Aber ich gehe davon aus, dass sich viele Leute darüber Gedanken gemacht haben, und meine Frage könnte ein Betrug sein ... alles, was ich sagen kann, ist, dass ich es nicht gefunden habe.

Wenn ich "Scrollen" nach oben sage, meine ich die Verwendung der "Pfeil nach oben" -Taste auf der Tastatur, die Sie offensichtlich beginnend mit dem letzten Befehl durch den Verlauf nach oben führt.

Sie finden also einen Befehl, vielleicht 30 Befehle zurück ... und führen ihn aus. Und dann wollen Sie den Befehl ausführen, der ursprünglich danach kam ... gibt es eine schnelle Möglichkeit, dies zu tun? Oder wie machen das die, die BASH fließend beherrschen?

Mike Nagetier
quelle

Antworten:

96

Wenn Sie den Befehl mit Ctrl+ oanstelle von Enterausführen, wird ein Befehl aus dem Verlauf ausgeführt und der nächste Befehl in die Warteschlange gestellt, anstatt an den Anfang des Bash-Verlaufs zurückzukehren.

Jon Reinhold
quelle
2
Ich habe es gerade in meiner eigenen Bash versucht, die in einem xterm unter NetBSD läuft, und es funktioniert nicht! Gibt es Einstellungen, die das beeinflussen können? Ich habe keine .inputrc-Datei. Co wird in der Handbuchseite für readline (3) nicht erwähnt.
Rhialto
@ Rhialto Verwenden Sie die viZeilenbearbeitung (aktiviert mit set -o vi) oder emacs? Denn Ctrl-Osoweit ich das beurteilen kann, wird das mit ersteren nicht funktionieren.
B Schicht
... aber das kann mit dem Befehl behoben werden: bind "\C-o":operate-and-get-next(oder alles abgeben bindzu ~/.inputrc)
B - Schicht
1
Ich habe herausgefunden, was mein Problem ist: ^ O wird als Flush Output-Zeichen verwendet (unter Linux nicht unterstützt), und readline deaktiviert dies nicht, solange es aktiv ist. Ich habe einen einfachen Patch bereitgestellt, aber der Betreuer von Bash und Readline behauptet, dass dies kein Fehler ist. Ich stimme dir nicht zu. Siehe lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto
19

Die Antwort von Jon Reinhold ist großartig, aber es gibt eine viel leistungsfähigere Lösung, die ich vorschlagen werde. Ich habe auch einen Kommentar zu einem GOTCHA in Jons Antwort, aber ich habe nicht genug Ruf, um direkt einen Kommentar abgeben zu können. @Jon Reinhold, wenn Sie dies lesen, richten Sie bitte meinen Kommentar an Sie unten.

Bash enthält einen Befehl fc, der die Zeilennummern der Bash-Verlaufsliste als Parameter verwendet. Anschließend wird Ihr Standardeditor mit diesen Zeilen als Text geöffnet. An diesem Punkt können Sie die Linien optional bearbeiten. Wenn Sie dann den Editor verlassen, führt bash diese Zeilen aus!

Ein Beispiel für eine Änderung, die Sie möglicherweise vornehmen möchten, ist das Anhängen an alle Zeilen außer der letzten, etwa "; read -p" next ... ". Dadurch wird jede Zeile von bash ausgeführt, und Sie werden aufgefordert, fortzufahren.

Kommentar für Jon Reinhold: Großartige Antwort, aber Sie sollten sie einschränken, denn wenn der Benutzer die Bash-Variable HISTCONTROL so eingestellt hat, dass sie einschließt erasedups, ist C-oder Benutzer nach der Ausführung verwirrt, da anstelle des erwarteten nächsten Befehls im Verlauf der nächste angezeigt wird wird Angezeigt werden. Dies liegt daran, dass bash die ursprüngliche Instanz des ausgeführten Befehls gelöscht hat und somit alle Befehle danach eine Zeile nach oben verschoben haben, d. H. auf eine niedrigere Indexnummer in der Verlaufsliste.

user1404316
quelle
Danke, als ich versuchte, die Antwort durch Suchen zu finden, war ich auf den Befehl "fc" gestoßen. Für mich ist dies die nächste Etappe, in der das langsame Baby eines BASH-Neulings den Weg des Ruhms in Richtung WISSEN einschlägt. Ich wollte den ersten kleinen Schritt.
Mike Nagetier
3
@mikerodent Nein. Es kommt also fcsowohl vor Ctl-oals auch vor sich bashselbst vor. (Im Gegensatz zu dieser Antwort ist es auch weniger nützlich.)
Kubanczyk
1
Das Problem mit erasedupsist eindeutig ein Bash-Bug (es hätte Vorkehrungen für diese Situation geben können). Gut zu wissen.
Alexis
2
@kubanczyk Das steht zur Debatte. Wenn es sich um einen komplexen, komplizierten Befehl handelt, je nachdem, was korrigiert werden muss, kann ich den gewünschten Editor viel schneller zum Aktualisieren des Befehls verwenden. Es wäre auch einfacher.
Pryftan
14

Eine weitere Möglichkeit , Ihr gewünschtes Verhalten zu erreichen wäre vertraut zu machen mit den bash Readline- Verknüpfungen (davon CTRL- oist ein glaube ich) und bash Geschichte Sucht.

Verlaufssuche

CTRL- rführt Sie zur Suche im Bash-Befehlsverlauf, wo Sie mit der Eingabe des gesuchten Befehls beginnen können und Bash den Befehl automatisch für Sie vervollständigt. Die Autocomplete-Funktionalität ist wirklich ziemlich gut. Befindet sich der auszuführende Befehl in der Eingabezeile, können Sie ENTERden Befehl ausführen oderCTRL - drücken e, um den Cursor an das Ende der Befehlszeile zu bewegen und den Verlaufssuchmodus zu beenden.

Die kühle Sache mit CTRL- ean diesem Punkt ist , dass die Geschichte Puffer kontextuell auf diesen Befehl gesetzt. Der nächste und der vorherige Befehl werden jetzt vor und nach der Zeile ausgeführt, in der die Verlaufssuche nach Ihnen gesucht hat. Sie können die Aufwärts- oder Abwärtspfeile drücken und den nächsten Befehl ausführen.

Die Verlaufssuche ist sehr leistungsfähig und bietet eine hervorragende Möglichkeit, die Verwendung des Aufwärtspfeils zu vermeiden, um überhaupt zum Befehl zurückzukehren. Eine schnelle Verlaufssuche kann viel Zeit beim manuellen Durchsuchen des Verlaufs sparen, und dann können Sie fortfahren CTRL- owie Jon oben ausgeführt hat.

Readline Short Cuts

Wenn Sie Ihr Bash-Fu verbessern möchten, würde ich empfehlen, die Readline-Shortcuts für die Pfeiltasten zu verwenden. Sie werden vielleicht feststellen, dass sie bequemer sind und es Ihnen ermöglichen, Ihre Schreibgeschwindigkeit zu erhöhen, aber natürlich YMMV. Hier sind ein paar mehr:

  1. CTRL- nfür den nächsten Befehl (Pfeil nach unten)
  2. CTRL- pfür den vorherigen Befehl (Pfeil nach oben entspricht)
  3. CTRL- bZurück ein Zeichen (Pfeil nach links entspricht)
  4. CTRL- fWeiterleiten eines Zeichens (Entsprechung mit Pfeil nach rechts)

Diese Readline-Verknüpfungen (zusammen mit CTRL- aZeilenanfang und CTRL- eZeilenende) erhöhen Ihre Geschwindigkeit und Effizienz in der Befehlszeile imo.

111 ---
quelle
2
Ich weiß es nicht. Ich finde, dass die Verwendung von Modifikatortasten langsamer ist als Pfeile oder jeder andere einzelne Tastendruck. Wie für EOL / etc. Ich benutze normalerweise die Home / End-Tasten (stty -a zeigt natürlich auch einige nützliche Dinge).
Pryftan
@Pryftan Fairerweise wird der letzte Satz als Meinung präsentiert (siehe 'imo'). Ich glaube, dass es eine gute Strategie für die Arbeit im Terminal oder für andere tippintensive Aufgaben ist, auf lange Sicht in der Startreihe der Tastatur zu bleiben. Einige Leute haben Tastaturen, bei denen sich die Pfeiltasten näher an den anderen Zeichen befinden. In diesem Fall sind die Readline-Verknüpfungen möglicherweise nicht zwingend. Ich werde die Antwort überarbeiten, um diesen letzten Punkt klarer zu formulieren.
111 ---
1
@datUser Tbh ​​Ich habe das 'imo' verpasst (oder wenn ich es nicht versäumt hätte, es in Betracht zu ziehen - durchaus möglich). Die umgekehrte Suche ist jedoch nützlich (mit +1), wenn sie für Sie funktioniert. Natürlich ist fc auch etwas (wie schon erwähnt) und benutzt es auch! (usw.). In Unices gibt es viele Möglichkeiten, eine Katze zu häuten. Was Tastaturen betrifft, so ist das auch ganz richtig: Ich habe eine Unicomp-Tastatur (ich liebe sie und bringe Erinnerungen zurück), aber natürlich gibt es auch andere Tastaturen, die man in Betracht ziehen sollte, ganz zu schweigen von Dvorak. Am Ende, je mehr Optionen Sie haben, desto besser geht es Ihnen und desto einfacher ist Ihre Arbeit (oder Ihr Spiel) :)
Pryftan