12.3Kommandoeingabe
Normalerweise nutzen Sie die bash einfach durch die Eingabe ganz gewöhnlicher Kommandos. Die bash unterstützt Sie dabei durch eine Menge praktischer Tastenkürzel und Sondertasten. Insbesondere können Sie mit den Cursortasten (ì) und (ë) die zuletzt eingegebenen Kommandos wieder bearbeiten, was eine Menge Tipparbeit spart. Beim Ausloggen aus einer Shell werden die zuletzt eingegebenen Kommandos in einer Datei ~/.bash_history gespeichert und stehen so auch nach dem nächsten Einloggen wieder zur Verfügung.
Kommandozeilen können wie in einem Texteditor verändert werden, das heißt, Sie können an beliebigen Stellen Zeichen einfügen und löschen. Die Tastaturbelegung der bash ist praktisch vollständig konfigurierbar. Außerdem können Sie zwischen dem emacs- und dem vi-Modus umschalten. Damit gelten für alle grundlegenden Edit-Kommandos dieselben Tastenkürzel wie im jeweils ausgewählten Editor. Die Standardeinstellung ist in der Regel der emacs-Modus. In diesem Kapitel werden alle Tastenkürzel ebenfalls für diesen Modus angegeben.
Expansion von Kommando- und Dateinamen
Mit der automatischen Expansion von Kommando- und Dateinamen hilft die bash Ihnen, den Tippaufwand zu minimieren. Dazu geben Sie zuerst die Anfangsbuchstaben des Kommandos oder des Dateinamens ein und drücken dann (ê). Wenn der Name bereits eindeutig identifizierbar ist, wird er vollständig ergänzt. Wenn es mehrere Namen gibt, die mit den gleichen Buchstaben beginnen, wird der Name nur so weit erweitert, wie die Namen übereinstimmen. Außerdem erklingt in diesem Fall ein Signalton, der darauf hinweist, dass der Dateiname möglicherweise noch nicht vollständig ist.
Am leichtesten ist die Expansion von Dateinamen anhand eines Beispiels zu verstehen. Die Eingabe
user$ ema (ê) ba (ê)
wird auf meinem Rechner im Verzeichnis mit den Dateien für dieses Buch automatisch zu
user$ emacs bash.tex
erweitert. Dabei ist emacs der Name meines Lieblingseditors und bash.tex der Name der LaTeX-Datei dieses Kapitels. Zur Vervollständigung von em durchsucht bash alle in der PATH-Variablen angegebenen Verzeichnisse nach ausführbaren Programmen. Zur Vervollständigung des Dateinamens wird dagegen nur das aktuelle Verzeichnis berücksichtigt.
Die Expansion funktioniert auch bei Dateinamen, denen mehrere Verzeichnisse vorangestellt sind. Wenn Sie
user$ ls /usr/sh (ê)
eingeben, erweitert bash diese Eingabe zu:
user$ ls /usr/share/
Wenn eine eindeutige Erweiterung nicht möglich ist (Signalton), können Sie einfach nochmals (ê) drücken. bash zeigt dann in den Zeilen unterhalb der aktuellen Eingabezeile alle möglichen Ergänzungen an. Die Eingabe
user$ e (ê) (ê)
führt zur Ausgabe einer fast endlosen Liste aller Kommandos und Programme, die mit dem Buchstaben e beginnen. Anschließend kann die Eingabe fortgesetzt werden.
Programme bzw. Scripts im lokalen Verzeichnis starten
Programme und Kommandos im gerade aktuellen Verzeichnis werden bei der Kommandoexpansion nur dann berücksichtigt, wenn das aktuelle Verzeichnis in der PATH-Variablen enthalten ist. Den Inhalt von PATH können Sie sich mit echo $PATH ansehen. Das aktuelle Verzeichnis wird durch ».« abgekürzt.
Bei allen gängigen Linux-Distributionen fehlt aus Sicherheitsgründen das aktuelle Verzeichnis in PATH. Um Programme aus dem aktuellen Verzeichnis auszuführen, müssen Sie daher ./name eingeben.
Die automatische Kommandoexpansion verschleiert, wo sich ein Programm nun wirklich befindet. Um das herauszufinden, gibt es mehrere Möglichkeiten:
-
which name durchsucht alle in PATH enthaltenen Verzeichnisse und ermittelt das Programm, das bei der Eingabe des Kommandos ohne Pfad ausgeführt würde. which ist dann interessant, wenn es mehrere Versionen eines Programms gibt, die sich in unterschiedlichen Verzeichnissen befinden.
-
type name funktioniert ähnlich wie which, berücksichtigt aber auch Kommandos, die in der bash integriert sind oder als Alias definiert sind.
Die bash bietet analoge Expansionsmechanismen auch für die Namen von Heimatverzeichnissen und für Variablennamen an: ~ko (ê) liefert auf meinem Rechner ~kofler/, $PAT (ê) ergibt $PATH.
Bei der Ausführung des Kommandos latex name.tex kommen als mögliche Dateien nur solche infrage, die mit *.tex enden. Wenn Sie man name ausführen, sind nur Einträge relevant, zu denen tatsächlich man-Texte existieren. Analog gibt es zahlreiche weitere Kommandos und Programme, bei denen die Auswahl der möglichen Dateien oder Parameter von vornherein eingeschränkt ist. Da ist es natürlich praktisch, wenn bei der Expansion nur solche Dateien bzw. Parameter berücksichtigt werden, die zum Kommando passen.
Genau darum kümmert sich das bash-Kommando complete. Viele Distributionen sind mit einer umfangreichen complete-Konfiguration ausgestattet, die aber teilweise extra installiert werden muss (Paket bash-completion). Die Konfiguration erfolgt in der Regel durch eine der folgenden Dateien:
Zur Definition eigener Expansionsregeln müssen Sie sich in die recht unübersichtliche Syntax von complete einarbeiten. Eine knappe Beschreibung geben help complete und man bash (suchen Sie nach Programmable Completion). Weitere Tipps zur Konfiguration des Expansionsmechanismus finden Sie unter:
http://www.pro-linux.de/artikel/2/153
Wichtige Tastenkürzel
Tabelle 12.1 fasst die wichtigsten Tastenkürzel der bash zusammen. Die Tabelle geht davon aus, dass bash für den emacs-Modus konfiguriert ist, wie dies bei nahezu allen Distributionen der Fall ist.
Kürzel |
Bedeutung |
---|---|
(ì), (ë) |
durch die zuletzt eingegebenen Kommandos scrollen |
(í), (î) |
Cursor zurück- bzw. vorbewegen |
(Strg)+(A), (Strg)+(E) |
Cursor an den Beginn bzw. an das Ende der Zeile bewegen |
(Alt)+(B), (Alt)+(F) |
Cursor um ein Wort rückwärts bzw. vorwärts bewegen |
(Alt)+(D) |
Wort löschen |
(Strg)+(K) |
bis zum Ende der Zeile löschen |
(Strg)+(Y) |
zuletzt gelöschten Text wieder einfügen |
(Strg)+(T) |
die beiden vorangehenden Zeichen vertauschen |
(Alt)+(T) |
die beiden vorangehenden Wörter vertauschen |
(ê) |
Expansion des Kommando- oder Dateinamens |
(Strg)+(L) |
den Bildschirm löschen |
(Strg)+(R) |
Suche nach früher eingegebenen Kommandos |
(Alt)+(.) |
den zuletzt verwendeten Parameter einfügen |
(Strg)+(ˆ) |
letzte Änderung rückgängig machen (Undo) |
Tabelle 12.1Die wichtigsten bash-Tastenkürzel
Die Funktion des Tastenkürzels (Alt)+(.) ist nur anhand eines Beispiels zu verstehen. Nehmen wir an, Sie haben gerade eine Datei kopiert (cp name1 name2). Nun wollen Sie im nächsten Kommando die Kopie wieder löschen. Statt rm name2 geben Sie rm und dann (Alt)+(.) ein. bash fügt automatisch den zuletzt verwendeten Befehlsparameter ein. Durch das mehrfache Drücken von (Alt)+(.) können Sie auch auf alle weiteren Parameter zurückgreifen, also auf name1 durch zweimaliges Drücken.
Auch das Tastenkürzel (Strg)+(R) bedarf einer ausführlicheren Erklärung:
Damit ist es möglich, bereits eingegebene Kommandos zu suchen: Drücken Sie am Beginn der Zeile (Strg)+(R), und geben Sie dann die ersten Zeichen der gesuchten Kommandozeile ein. bash zeigt daraufhin automatisch das zuletzt verwendete Kommando mit diesen Anfangsbuchstaben an. Mehrmaliges Drücken von (Strg)+(R) wechselt zwischen verschiedenen passenden Möglichkeiten. (Strg)+(S) funktioniert wie (Strg)+(R), durchläuft die Liste passender Kommandos aber in umgekehrter Richtung. (¢), (ê) und die Cursortasten brechen die Suche ab und führen das gefundene Kommando aus bzw. ermöglichen das Editieren der gefundenen Zeile.
Manche Konsolen betrachten (Strg)+(S) als Anweisung, die Ausgabe vorübergehend zu stoppen. Erst (Strg)+(Q) setzt die Ausgabe wieder fort. Wenn Ihre Konsole so auf (Strg)+(S) reagiert, können Sie die Kommandosuche nur mit (Strg)+(R) durchführen.
Die bash-Tastenkürzel stammen eigentlich von der readline-Bibliothek, die von bash zur Verarbeitung von Eingaben genutzt wird. Noch mehr Kürzel finden Sie mit man readline.
Alias-Abkürzungen
Mit dem Kommando alias können Sie sich bei der Eingabe von Kommandos in der Shell einige Tipparbeit ersparen. Mit diesem Kommando werden Abkürzungen definiert. Bei der Verarbeitung der Kommandozeile wird überprüft, ob das erste Wort eine Abkürzung enthält. Wenn das der Fall ist, wird die Abkürzung durch den vollständigen Text ersetzt.
Abkürzungen für eine bestimmte Kombination von Optionen oder für Dateinamen sind nicht möglich, weil die bash die weiteren Parameter eines Kommandos nicht nach Abkürzungen durchsucht. Die bash erkennt aber Sonderfälle, bei denen in einer Kommandozeile mehrere Programme genannt werden (Pipes, Kommandosubstitution, sequenzielle Ausführung von Kommandos mit »;«), und durchsucht alle vorkommenden Kommandonamen auf Abkürzungen.
Durch das obige Kommando wird die Abkürzung cdb definiert, mit der ich rasch in das von mir oft benötigte Verzeichnis /home/kofler/linuxbuch wechseln kann.
alias-Aufrufe können auch verschachtelt eingesetzt werden. Beachten Sie, dass alias-Abkürzungen Vorrang gegenüber gleichnamigen Kommandos haben. Das kann dazu genutzt werden, um den unerwünschten Aufruf eines Kommandos zu vermeiden:
Von nun an führt jeder Versuch, das Kommando more aufzurufen, zum Start des leistungsfähigeren Programms less. Sollten Sie aus irgendeinem Grund dennoch more benötigen, müssen Sie den gesamten Pfadnamen angeben (/bin/more) oder einen Backslash voranstellen (\more). Der Backslash verhindert in diesem Fall die Alias-Auswertung.
alias-Abkürzungen können mit unalias wieder gelöscht werden. Ansonsten gelten sie bis zum Verlassen der Shell (also spätestens bis zum Logout). Wenn Sie bestimmte Abkürzungen immer wieder benötigen, sollten Sie die alias-Anweisungen in die Dateien /etc/bashrc oder .bashrc in Ihrem Heimatverzeichnis aufnehmen.
Bei vielen Distributionen sind diverse alias-Abkürzungen vordefiniert. Wenn also beispielsweise rm ständig fragt, ob die Datei wirklich gelöscht werden soll, ist meist der vordefinierte Alias rm=rm -i schuld. Eine Liste mit allen gerade gültigen Abkürzungen liefert das Kommando alias. Die folgenden Zeilen geben an, an welchen Orten Debian, Fedora, SUSE und Ubuntu alias-Definitionen berücksichtigen:
/etc/bashrc /etc/profile.d/*.sh ~/.bashrc |
|
SUSE: |
/etc/bash.bashrc /etc/profile.d/*.sh ~/.bashrc ~/.alias |
Eine ähnliche Wirkung wie Abkürzungen können auch Shell-Programme haben.
Shell-Scripts haben zudem den Vorteil, dass sie mit Parametern ($1, $2 etc.) zurechtkommen und flexibler eingesetzt werden können.