Bash-Workshop

Die Bash, das unbekannte Wesen

Alle bereits einmal in einer Bash ausgeführten Befehlszeilen werden in einem Speicher – dem History-Buffer – gespeichert. Dieser Teil unserer Serie über die Bash beschäftigt sich mit diesem Speicher und zeigt den Zugriff auf die dort enthaltenen Informationen.

Ein Überblick

Im letzten Teil dieser Serie haben wir verschiedene Möglichkeiten diskutiert, um Befehlszeilen mehr oder weniger unter Zuhilfenahme interner Funktionen der Bash (genauer: der Readline-Library) aus den Informationen zu konstruieren, die der Shell intern zur Verfügung stehen. Eine Zusammenfassung der wichtigsten Tastenkombinationen zeigt Tabelle 1. Besonders die unterschiedlichen Mechanismen der Komplettierung (dem automatischen Ergänzen teilweise eingegebener Zeichenketten) sind sehr nützlich und sparen dem Anwender viele Tastendrücke. Diesmal soll mit der History ein weiteres, effektives Hilfsmittel zur Eingabe und Bearbeitung von Befehlszeilen vorgestellt werden. Die Funktionen für diesen Einsatzzweck sind in der GNU-History-Library (/lib/libhistory.so) zusammengefaßt.

Emacs-Modus

Die Eingabe der Bash kann in zwei unterschiedlichen Stilrichtungen – den Modi – erfolgen. Neben dem voreingestellten Emacs-Modus (der sich an den Gepflogenheiten dieses Editors orientiert) kann auch der VI-Editor imitiert werden. So ist sichergestellt, daß geübte Anwender sehr effektiv mit der Bash arbeiten können und nicht versehentlich falsche Tastenbefehle benutzen, die sie von ihrem Editor gewohnt sind. Die Eingabemodi werden mit dem Befehl

$> set -o vi

in den VI-Modus bzw. durch

$> set -o emacs

zurück in den Emacs-Modus geschaltet.

Tabelle 1:Die wichtigsten Editierfunktionen der Bash im Emacs-Modus

Bewegen des Cursors in der Befehlszeile
[Control-a] Sprung an den Anfang der Befehlszeile
[Control-e] Sprung ans Ende der Befehlszeile
[Control-b] ein Zeichen zurück (nach links)
[Meta-b] ein Wort zurück
[Control-f] ein Zeichen vor
[Meta-f] ein Wort vor
Löschen und "killen" von Teilen der Befehlszeile
[Control-h] Zeichen links löschen
[Control-d] Zeichen unter dem Cursor löschen
[Control-k] Zeile ab Cursorposition killen
[Meta-d] Wort links killen
[Control-u] Zeile killen
[Control-w] Wort links killen
[Meta][Control-h],[Meta][Control-?] Wort links löschen
[Control-x][Control-?] Löschen bis zum Zeilenanfang
Einfügen gekillter Passagen
[Control-y] Einfügen aus dem Kill-Ring
[Meta-y] Kill-Ring rotieren
[Meta-.] 'ntes Argument der vorigen Zeile einfügen
Andere Funktionen
[Control-g] Aktion abbrechen
[Control-j],[Return] Zeile ausführen
[Control-]] Sprung zum nächsten Auftreten des Buchstabens
[Meta][Control-]] Sprung zum vorherigen Auftreten des Buchstabens
[Control-l] Terminal löschen
[Control-i] komplettieren
[Meta-!] Befehlsnamen komplettieren
[Meta-/] Dateinamen komplettieren
[Meta-@] Hostnamen komplettieren
[Meta-~ ] Usernamen komplettieren
[Meta-$] Variablennamen komplettieren
[Meta-{] Komplettieren in Klammern
[Control-x][Control-v] Shellversion anzeigen
[Control-x][Control-r] Initfile erneut einlesen
[Control-_],  
[Control-x][u] Undo
[Meta][Control-r] Komplettes Undo der Zeile
[Meta-l] Wort in Kleinbuchstaben umwandeln
[Meta-c] Wort mit einem Großbuchstaben beginnen lassen
[Control-t] Vertauschen der Buchstaben um den Cursor
[Meta-t] Vertauschen der Wörter um den Cursor
[Meta-0] bis [Meta-9] Numerische Argumente eingeben
Suchen im Historybuffer
[Control-r] Rückwärtiges Suchen im Historybuffer
[Control-s] Vorwärts im Historybuffer suchen
[Meta][Control-i] Komplettieren aus dem Historybuffer
[Control-<] An den Anfang des Historybuffers
[Control-n] Nächste Historyzeile anzeigen
[Control-p] Vorige Historyzeile anzeigen

Alle Befehlszeilen werden in einer speziellen Datei – der History-Datei – gespeichert. Diese History-Datei stellt damit zum einen eine Art Logbuch dar, anhand dessen Einträge der Anwender sich vergegenwärtigen kann, welche Aktionen bereits ausgeführt wurden; andererseits ermöglicht sie das Lernen aus der Vergangenheit. Eine gute Lösung, die in Form von mehreren Befehlszeilen in der History-Datei vorhanden ist, kann mit wenig Aufwand in ein Shell-Programm (Script) umgesetzt werden.

Die vorhergehenden Befehlszeilen haben übrigens auch für die Konstruktion neuer Zeilen eine besondere Bedeutung. Oftmals sind Eingaben wie die folgenden zu beobachten:

$> ls /usr/share/info
...
bash.info  fileutils.info  libg++.info-4
...
$> cp /usr/share/info/bash.info .
$> emacs /usr/share/info/bash.info
$> info  /usr/share/info/bash.info

In diesen Befehlszeilen entspricht mindestens ein Argument in der aktuellen Befehlszeile einem der vorhergehenden, bzw. bezieht sich darauf. In den meisten Fällen handelt es sich um das letzte Argument der vorhergehenden Befehlszeile. Anwender können sich mit einer ganz einfachen Tastenkombination hier erheblichen Tippaufwand ersparen:

$> ls /usr/share/info
...
$> cp [META][.] /usr/share/info/ba[Tab]sh.info ...

Durch die Tastenkombination [Meta]+[.] fügt der Bashzeileneditor automatisch das letzte Argument der vorherigen Befehlszeile an der aktuellen Position ein. (Nochmals zur Erinnerung: Die Meta-Taste wird auf den normalen Keyboards durch die linke Alt-Taste emuliert oder alternativ durch das Drücken der Esc-Taste vor der Eingabe der zweiten Taste.) Die verwendete Readline-Funktion heißt insert-last-argument. Für Spezialisten: Beim Übergang von der zweiten (cp ...) zur dritten Zeile (emacs...) wird aber nicht das letzte, sondern das vorletzte (das in der Befehlszeile erste) Argument benötigt. Auf dieses kann ganz einfach mit der Funktion yank-nth-arg zugegriffen werden, die an die Tastenkombination [Meta-Control-y] gebunden ist. Die Zählweise der Bash beginnt hierbei mit dem 0ten Argument (dem Befehl) an der ersten Position in der Befehlszeile.

Ein zweiter, sehr nützlicher Mechanismus wird als Quick-Substitution bezeichnet und verwendet ebenfalls die Informationen aus der letzten Befehlszeile. In manchen Situationen ändern sich aufeinanderfolgende Befehlszeichen nur geringfügig:

$> ls ~/test -r
$> rm ~/test -r

In diesem Fall kann die zweite Befehlszeile aus der ersten konstruiert werden, indem ls durch rm ausgetauscht wird. Genau dies ermöglicht die Quick-Substitution:

$> ls ~/test/ -r
$> ^ls^rm[Return]
rm ~/test/ -r
rm: in Verzeichnis <C>test<C> absteigen?

Die Substitution ist nicht auf die Befehle in der Befehlszeile beschränkt:

$> ls ~/test/ -r
$> ^st^st1[Return]
ls ~/test1/ -r
...

Jede beliebige Zeichenfolge kann ausgetauscht werden, allerdings wird nur das erste Auftreten der Zeichen ersetzt.

Die Befehlszeilenhistory (so der korrekte Name) ist zu jedem Zeitpunkt über die Aufwärts-Pfeil-Taste [Cursor hoch] erreichbar. Jede Betätigung dieser Taste holt eine weitere zuvor ausgeführte Befehlszeile zurück. Diese Befehlszeilen können normal editiert werden, die Return-Taste führt die aktuelle Zeile – so wie sie momentan dargestellt wird – aus. Auch das Scrollen in die Gegenrichtung ist möglich: Sind Sie durch allzu heftigen Einsatz der Aufwärts-Pfeil-Taste zu weit in die Geschichte eingetaucht, dann können Sie mit der Abwärts-Pfeil-Taste wieder in Richtung Gegenwart wandern.

Die History-Datei

Die Befehlszeilenhistory wird von der Bash in Form einer Datei gespeichert. Die Bash legt diese Datei im Home-Verzeichnis unter dem Namen .bash_history automatisch an oder, sofern diese Datei bereits existiert, liest sie sie beim Start ein. In dem zweiten Fall wird damit der Inhalt der Datei automatisch in den eingebauten Historybuffer der Bash kopiert. Damit sind die Zeilen über die Cursortasten erreichbar.

Untersuchen Sie einmal, ob sich diese Datei bei Ihnen anfindet. Sie hat etwa folgenden Aufbau:

ps x | grep xemacs
kill -HUB 1325
kill -1 1321
ll -rt
xemacs
bg                
ls -rt
wipe ~/del_me
...

Es handelt sich dabei um eine einfache Textdatei, die mit jedem Editor oder Pager (Seitenanzeigeprogramm à la more und less) angezeigt werden kann. Einige der wichtigsten Funktionen zur Verwaltung der History-Datei ermöglichen das Suchen im Historybuffer.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Hardcore-Linux
    In diesem ersten Teil einer Serie über die Bash verraten wir Ihnen erste Geheimnisse beim Umgang mit dem Befehlszeileninterpreter. Probieren Sie alles aus! Nur so kann man das erlernte Wissen behalten und vertiefen.
  • Bash-Konfiguration, die zweite
    In diesem zweiten Teil der Serie über die Konfiguration der Bash wird es noch einmal praktisch: Das Einstellen des Prompts, und die für die Fehlersuche so nützlichen Tracing-Modi werden beschrieben.
  • Bash-Kurs Teil 6
    Die elementaren Konfigurationsmöglichkeiten mit eingebauten Funktionen der Bash sind der Schwerpunkt dieses Teils. Im nächsten wird ein komfortables Tool zur Erzeugung von Konfigurationsdateien vorgestellt.
  • Teil 1: Grundlagen der BASH
    Haben Sie auch schon einmal am Computer gesessen und sich über immer wiederkehrende Arbeit geärgert, die man mit einem kleinen Programm vereinfachen könnte? Im ersten Teil unseres Programming Corners steigen wir in die Welt der Programmierung ein.
  • Die Bash, das unbekannte Wesen
    Es gibt neben den Pipes noch verschiedene andere Verfahren, um mehrere Shell-Befehle miteinander zu verbinden bzw. sie parallel auszuführen. Die wichtigsten Methoden werden in dieser Folge der Bash-Serie vorgestellt.
Kommentare

Infos zur Publikation

LU 10/2016: Kryptographie

Digitale Ausgabe: Preis € 0,00
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Aktuelle Fragen

Soundkarte wird erkannt, aber kein Ton
H A, 25.09.2016 01:37, 6 Antworten
Hallo, Ich weiß, dass es zu diesem Thema sehr oft Fragen gestellt wurden. Aber da ich ein Linu...
Scannen nur schwarz-weiß möglich
Werner Hahn, 20.09.2016 13:21, 2 Antworten
Canon Pixma MG5450S, Dell Latitude E6510, Betriebssyteme Ubuntu 16.04 und Windows 7. Der Canon-D...
Meteorit NB-7 startet nicht
Thomas Helbig, 13.09.2016 02:03, 3 Antworten
Verehrte Community Ich habe vor Kurzem einen Netbook-Oldie geschenkt bekommen. Beim Start ersch...
windows bootloader bei instalation gelöscht
markus Schneider, 12.09.2016 23:03, 1 Antworten
Hallo alle zusammen, ich habe neben meinem Windows 10 ein SL 7.2 Linux installiert und musste...
Ubuntu 16 LTE installiert, neustart friert ein
Matthias Nagel, 10.09.2016 01:16, 3 Antworten
hallo und guten Abend, hab mich heute mal darangewagt, Ubuntu 16 LTE parallel zu installieren....