Aus Linux-Magazin 05/2010

Shellskripte aus der Stümper-Liga - Folge 8: Zu viel tippen

Die Bash ist das Arbeitsmittel der Linux-Administratoren. Was die Tastatur angeht, fahren jedoch viele mit angezogener Handbremse. Mit wenigen Kniffen schalten selbst faule Tipper einen Gang hoch .

Die Kommandozeile ist für manchen Benutzer immer noch ein mit sozio-technischem Bann belegtes Mysterium. Sobald sie schwarze Fenster mit weißen Buchstaben sehen, schalten sie auf stur: “Ich möchte meinen Computer nicht programmieren, nur surfen”, jammert mancher bei dem Hinweis, dass sich vielerlei Aufgaben in der Shell schneller erledigen lassen. Trauen sich Tapfere dennoch an die Untiefen des Kommandoprompts, kopieren sie meist den Arbeitsstil, den ihnen Explorer, Dolphin & Co. eingebläut haben: Sie traversieren Verzeichnis für Verzeichnis durch den Ordnerbaum (siehe Abbildung 1).

Abbildung 1: Hier tippt sich ein GUI-Fan von Verzeichnis zu Verzeichnis, wie er es aus Explorer & Co. gewohnt ist. Schnell und effizient geht's anders.

Abbildung 1: Hier tippt sich ein GUI-Fan von Verzeichnis zu Verzeichnis, wie er es aus Explorer & Co. gewohnt ist. Schnell und effizient geht’s anders.

Schnelle Navigation

Die gute Nachricht ist, dass die Bash viele Möglichkeiten bietet, schnell zwischen mehreren Verzeichnissen zu navigieren – oder hilft, gleich ganz darauf zu verzichten: Niemand muss nach »/var/log« navigieren, um die Datei »messages« anzusehen. Nur wer mehrere Dateien eines Verzeichnisses bearbeitet, zieht Vorteile aus einem Wechsel: Relative Pfade sind kürzer und sparen ein langes Präfix.

Die Bash bietet zusätzlich zu »cd« noch die Befehle »pushd« und »popd« für die Verzeichnisnavigation. Ein »pushd Verzeichnis« wirkt wie »cd«, speichert aber zusätzlich das Verzeichnis in einer internen Liste, »dirs« zeigt sie an. Ohne Argument wechselt »pushd« zum letzten Verzeichnis. Analog entfernt »popd« das gerade verlassene Verzeichnis vom Stapel. Ist der bereits höher, springt der Bash-Profi mit »pushd +2« zum vorletzten Verzeichnis.

Die Pushd-Methode hat immer noch den Nachteil, die Verzeichnisse einmal tippen zu müssen. Tricks helfen bei immer wieder benötigen Ordnern: Der Eintrag »alias mycd=’cd /usr/share/doc/packages’« in »$HOME/.bashrc« etwa kürzt den Befehl ab. Aliase beschränken sich nicht nur auf Verzeichniswechsel, mit ihnen lässt sich jeder oft verwendete Befehl abkürzen, etwa »alias ..=’cd ..’«, um ins übergeordnete Directory zu wechseln.

Flexibler als Aliase sind Umgebungsvariablen. Mit »d=/usr/share/doc/packages« und »less $d/openssh/README« kommt der Anwender mit weniger Tastenanschlägen aus. Bei Bookmarks, die Terminalemulationen wie die KDE-Konsole bieten, verlässt er zwar die reine Bash-Funktionalität, nutzt aber dafür die Vorteile der Maus: Das Zielverzeichnis ist nur einen Klick entfernt – vielleicht ist das ein Kompromiss für Skeptiker in einer Migrationsphase.

Die Bash kennt über die eingebaute Readline-Bibliothek viele Funktionen und bindet sie an Tasten. Der Befehl »bind -l« listet diese Aktionen (je nach Version rund 150), »bind -p« zusätzlich die Zuordnung zu den Tasten. Die Funktionen ersparen Tipparbeit. Nützlich sind die Tasten [Tab] für die Autovervollständigung, [Esc][.] für das letzte Argument der Vorgängerzeile oder [Ctrl]+[R] für die inkrementelle Suche rückwärts.

Es lassen sich Folianten mit vollständigen Erklärungen der einzelnen Funktionsperlen füllen, nützlich sind aber besonders die nur selten genutzten Tastaturmakros, die Emacs-Anwender auch kennen. [Ctrl]+[X] und dann [(] startet die Aufzeichnung, [Ctrl]+[X][)] beendet sie, die Kombination [Ctrl]+[E] führt das letzte Makro aus. Will man zum Beispiel eine Datei in einem entfernten Verzeichnis umbenennen – etwa von »/Pfad/foo.JPG« nach »…/foo.jpg« – erspart es ein Ad-hoc-Makro, den Befehl ein zweites Mail einzutippen.

Bash keck? Cash
back!

Seit mehreren Folgen prügelt das “Bash Bashing” auf Unsitten und Missverständlichkeiten der Shell ein – und gibt Fingerzeige, es besser zu machen. Wem daher ein bashenswürdiges Skript vor die Tastatur kommt, schreibt an [redaktion@linux-magazin.de] und kassiert wahlweise 50 Euro Finderlohn oder ein Jahresabo des Linux-Magazins – sollte die Redaktion den Tipp abdrucken. Bei besonders haarsträubenden Fällen sichert die Redaktion selbstredend vertraulichen Informaten- und Opferschutz zu.

Tastenbelegung anpassen

Nur Gedächtnisgenies merken sich viele Befehle und die zugehörigen Tastenkombinationen. Warum also Tasten nicht so zuordnen, dass sie für einen selbst sinnvoll belegt sind? Niemand ist dabei auf die vordefinierten Funktionen beschränkt, auch Befehle oder Befehlsteile bindet der Bash-Profi an einzelne Tasten.

Dafür gibt es zwei Techniken: Erstens erwartet die Bash in »$HOME/.bashrc« eine Reihe von »bind«-Befehlen (siehe Listing 1). Alternativ dazu belegt die Bash-unabhängige Readline-Initialisierungsdatei »$HOME/.inputrc« die Tasten (siehe Listing 2). Die Syntax ist etwas verschieden, der Effekt bleibt gleich.

Listing 1: Tastenzuordnung per
».bashrc«

01 # F1: zeigt /var/log/messages
02 bind '"eOP":"tail -f /var/log/messagesn"'
03 # F2: der Entwicklungsdreischritt
04 bind '"eOQ":"configure; make; su -c"make install"n"'
05 # F3: wiederholt das letzte Wort der aktuellen Zeile
06 bind '"eOR":"!#$e^"'

Listing 2: Tastenzuordnung per
».inputrc«

01 # F1: zeigt /var/log/messages
02 "eOP": "tail -f /var/log/messagesn"
03 # F2: der Entwicklungsdreischritt
04 "eOQ": "configure; make; su -c"make install"n"
05 # F3: wiederholt das letzte Wort der aktuellen Zeile
06 "eOR": "!#$e^"

Die Listings zeigen die Belegung einiger der von der Bash per Voreinstellung nicht genutzten Funktionstasten. Da die Windowmanager schon ein paar Tasten abfangen, kommen allerdings nicht alle Kombinationen von Sondertaste und Funktionstaste bei der Bash an. Die Steuercodes der Sondertasten einschließlich ihrer Kombinationen zeigt beispielsweise die Sequenz [Ctrl]+[Q][Taste] an. Angewendet auf [Esc] gibt sie die magische Folge »^[« aus, auf [F1] angewendet »^[OP«. Letztere hängt allerdings vom eingestellten Terminal ab, hier gibt es verschiedene Varianten, je nach Einstellung in »/etc/inputrc«.

Geschichtsstunde

Ein weiteres wichtiges Feature der Shell ist die Historie. Statt Befehle nochmals zu tippen, sucht der Anwender den Befehl einfach in der Liste der bereits eingegebenen Befehlszeilen. Das funktioniert sowohl mit den Pfeil- und Bildtasten als auch mit Suchfunktionen. Am bekanntesten ist wohl [Ctrl]+[R] für die inkrementelle Rückwärtssuche. Weniger bekannt und in der Notation obskur erscheinen aber die Möglichkeiten der so genannten History-Expansion. Mit »!n« referenziert der Kommandozeilen-User einen Befehl der Historie. Wer dessen Nummer nicht mehr weiß, schaut mit »history« die Liste der gespeicherten Befehle an. Das gelingt auch mit relativer Referenzierung: Der Aufruf »!-3« etwa bezieht sich auf den drittletzten Befehl. Der Spezialfall »!!« ist identisch zu »!-1«.

Interessant sind die Substitutionsmechanismen: »!!:s/foo/bar/« ersetzt den String »foo« durch »bar« im letzten Befehl. Das geht sogar noch einfacher: »^foo^bar^«. Neben der Substitution unterstützt die Shell-Historie noch weitere Flags, um die ausgewählte Zeile zu ändern. Die Befehle lehnen sich an Sed an, aber insgesamt ist das alles zu kryptisch, um es sich zu merken, und Nachschlagen dauert länger als Tippen. Die von Perl inspirierte Kombination mit fünf Sonderzeichen »!#$ESC^« legt das Beispiel auf die Funktionstaste [F3], damit erspart man sich sogar das oben erwähnte Keyboard-Makro.

[Tab] ist des Kommandozeilen-Users bester Freund, sie komplettiert Befehle und Dateinamen. Findet die Bash jedoch das Paket »bash-completion« vor, kennt die Taste plötzlich zusätzlich Optionen und Subkommandos vieler Programme.Wer nicht alle Optionen von »grep« auswendig kennt, tippt nach »grep foo –« zweimal die Tabulatortaste (siehe Abbildung 2). Das Paket ist übrigens in der Bash implementiert und leicht erweiterbar. Die zugehörige Datei »README« liest sich in Teilen wie eine Zusammenfassung der Bash-Bashing-Serie, denn der Completion-Code soll natürlich möglichst effizient sein.

Abbildung 2: Findet die Shell das Paket Bash-Completion vor, kennt sie plötzlich eine große Anzahl von Optionen vieler wichtiger Shellkommandos.

Abbildung 2: Findet die Shell das Paket Bash-Completion vor, kennt sie plötzlich eine große Anzahl von Optionen vieler wichtiger Shellkommandos.

Bash ist nicht nur eine mächtige Skriptsprache, sondern auch als Shell leicht und effizient zu bedienen. Wichtige Tastenkombinationen gehören an die Pinnwand über dem Schreibtisch, immer wieder genutzte Verzeichnisse in Aliase oder Umgebungsvariablen.

Gewonnene Lebenszeit

Die mächtigen Readline- und History-Funktionen sind übrigens nicht Bash-spezifisch. Jeder Programmierer kann in seine Projekte die Libreadline und die Libhistory einbinden – sogar in ein GUI-Interface. Die entsprechenden Wrapper sind auch für andere Programmiersprachen zu haben. (mg)

Der Autor

Bernhard Bablok betreut bei der Allianz Shared Infrastructure Services ein Datawarehouse mit technischen Performancemessdaten von Mainframes bis zu Servern. Wenn er nicht Musik hört, mit dem Rad oder zu Fuß unterwegs ist, beschäftigt er sich mit Linux oder Objektorientierung.

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben