Kommandozeilen-Jongleur
The Answer Girl
Fast alles wie im Emacs
Eine unendliche Spielwiese, doch einfacher tut man sich in der Regel, wenn man – wie mit den Pfeiltasten – ein altes Kommando auf die Befehlszeile bekommt und darin nach Herzenslust herumeditieren kann. Dafür zuständig ist – man bash gibt Aufschluss – die Readline-Bibliothek, die wiederum dafür sorgt, dass Emacs-Benutzer(innen) bereits bekannte Emacs-Tastenkürzel zum Editieren der Kommandozeile benutzen können. (Der ebenfalls mögliche und in der aktuellen Shell mit set +o vi einschaltbare vi-Modus dagegen ist selbst bei Hardcore-Vi-Verfechter(inne)n kaum in Gebrauch.) Zu beachten gibt es dabei lediglich, dass nicht alles, was in einem Editor mit ausgedehnten Fähigkeiten möglich ist, auch für einen Zeilen-Editor, wie die Shell ihn mit der Kommandozeile bietet, sinnvoll ist. Der Emacs-Modus der Shell umfasst also nur einen winzigen Bruchteil der Möglichkeiten des Namensgebers.
Doch lassen Sie uns einiges ausprobieren. Da der Emacs mit [Strg-r] rückwärts sucht, sollte sich denn wohl auch in der Bash mit dieser Tastenkombination etwas anstellen lassen. Versuchen wir einmal, den ping-Befehl auf bashir aus der Beispiel-History zu kramen. Tatsächlich bringt ein [Strg-r]ba das Ergebnis
(reverse-i-search)`ba': man bash
…, das letzte eingetippte Kommando, das die Zeichenkette ba enthielt. Ein Druck auf die [Return]-Taste zum Abschicken dieses Befehls bietet sich an dieser Stelle nicht an, denn wir haben die gesuchte Kommandozeile noch gar nicht gefunden. Also vervollständigen wir unser bisheriges Suchmuster ba mit shi, und schon schlägt die Shell
(reverse-i-search)`bashi': ping bashir
vor. Sollte auch dies nicht unseren Wünschen entsprechen, hilft tatsächlich das Emacs-Abbruchkommando [Strg-x][Strg-c] (Abbrechen ohne Speichern) weiter. Doch wozu umständlich, wenn's auch einfach geht: Ein einfaches [Strg-c] (bekannt als Tastenkommando zum Beenden nicht-renitenter Vordergrundprozesse) tut es hier ebenfalls.
Doch was tun, wenn das gefundene Kommando zwar größtenteils unseren Erwartungen entspricht, aber eben doch nicht so ganz? Ein (ebenfalls nicht ganz Emacs-konformes) [Esc] sorgt dafür, dass das aktuell gefundene Kommando zum Editieren in der Kommandozeile erscheint.
Der Zielrechner heißt nicht bashir, sondern bahsir? Im Emacs tauscht [Strg-t] zwei vertauschte Buchstaben aus. Also Cursor auf's h in bashir gesetzt und [Strg-t] gedrückt, schon wechseln das h und das davorstehende s die Plätze.
Was mit Buchstaben geht, sollte auch mit ganzen Wörtern gehen. Hier kann man sich von der Faustregel leiten lassen, dass ähnliche Aktionen (manchmal) auch ähnliche Kürzel haben: Das t wie "tauschen" bleibt, doch statt [Strg] gilt es, [Alt] zu drücken. Steht der Cursor über bahsir, tauscht dieses Wort auf ein [Alt-t] hin mit seinem Vorgänger den Platz: Aus ping bahsir wird bahsir ping. Ein weiteres [Alt-t] tauscht die beiden auch wieder zurück. Zu beachten gibt es dabei lediglich, dass auch Bindestriche und Punkte hierbei als "Worttrenner" zählen: Hat man etwa den Namen einer Datei (zum Beispiel index.html) am Prompt eingegeben und kommt jetzt darauf, schlafmützigerweise den darauf anzuwendenden Befehl vergessen zu haben, kann man das vi (oder emacs oder less…) zwar dahinter schreiben…
pjung@chekov:~$ index.html vi
… und [Alt-t] drücken. Das Ergebnis ist jedoch nicht vi index.html, sondern
pjung@chekov:~$ index.vi html
Die Dateinamensendung, durch einen Punkt vom Basisnamen index getrennt, zählt als Wort und wird demzufolge gegen die Zeichenkette vi getauscht. Diese eindeutig missglückte Tauschaktion hätten wir gern rückgängig gemacht. Im Emacs geht das mit [Strg-x-u], und siehe da, auch die Bash stellt daraufhin wieder das alte index.html vi zur Schau.
Zweimal die Backspace-Taste sorgt jetzt zwar dafür, dass das vi am Ende wieder verschwindet, aber sobald ganze auszuradierende Wörter etwas länger werden, erspart ein Tastenkürzel zum Entfernen des vor dem Cursor stehenden Worts den Handgelenken einige Belastung. Also machen wir gleich Nägel mit Köpfen und begeben uns auf die Suche nach der entsprechenden Tastenkombination.
Alles meta
Nur – wonach suchen wir eigentlich? So etwas wie eine Tastenbelegungstabelle enthält die bash-Manpage leider nicht. Doch da war doch was, Readline-Bibliothek …, wenn die für die Manipulationsmöglichkeiten der Kommandozeile zuständig ist, sollte doch unter diesem Thema etwas zu finden sein. Tatsächlich gibt es einen Abschnitt READLINE, der netterweise auch gleich erklärt, warum es so schwierig ist, als unbedarfter User dieser Manpage nach Tastenkürzeln zu fahnden: Die Dokumentation verwendet für deren Angaben die Emacs-Syntax.
Das heißt, dass [Strg] mit C (wie die Beschriftung der entsprechenden englischen Taste [Ctrl]) gemeint ist, während M einen mysteriösen Meta-Key bezeichnet. Den gibt es jedoch auf PC-Tastaturen nicht. Je nach Vorkonfiguration des Rechners übernimmt die [Alt]- und/oder die in der Manpage erwähnte [Esc]-Taste seine Funktion. Und tatsächlich: Statt [Alt-t] kann auch [Esc-t] zwei Wörter vertauschen.
Allerdings, so macht die Manpage im Anschluss klar, sind alle Angaben ohne Gewähr: Sollten dokumentierte Tastenkombinationen andere Effekte als die beschriebenen haben, dann liegt das vermutlich an individuellen Einstellungen in den Readline-Konfigurationsdateien: Wenn die Umgebungsvariable INPUTRC nichts anderes sagt, kommt das persönliche Konfigurationsfile ~/.inputrc zum Zuge. Zudem besteht die Möglichkeit einer in den Manpages einiger Distributionen nicht erwähnten globalen Konfigurationsdatei /etc/inputrc.



