|
Bash - Die Linux-Shell
Die Bash (Bourne Again SHell) ist vollständig kompatibel zu der originalen
Bourne-Shell aber sie hat etliche Erweiterungen erfahren. Sie ist bei fast allenLinux-Systemen die Standard-Shell.Beim Start liest die Bash eine Reihe von Konfigurationsdateien ein,interpretiert deren Inhalt und übernimmt bestimmte Einstellungen. Wasdabei genau geschieht, hängt von mehreren Faktoren ab. Ist die Bash als Login-Shell eingestellt, wird zunächst dieLogin-Konfigurationsdatei .bash_profile im Home-Verzeichnisdes Anwenders gesucht. Ist sie vorhanden, führt die Bash die darin
enthaltenen Befehle aus. Fehlt diese Datei, sucht die Bash im
selben Verzeichnis nach einer Konfigurationsdatei mit dem Namen
.bash_login. Fehlt auch diese, wird versucht, die
systemweit gültige Konfigurationsdatei /etc/profile
einzulesen und auszuwerten. Als letzte Möglichkeit versucht die
Login-Bash, die Datei .profile im Home-Verzeichnis des
Anwenders auszuführen.
Als interaktive (Sub) Shell liest die Bash ihre Konfiguration
aus der Datei .bashrc (im Home-Verzeichnis des Anwenders).
Eine interaktive Bash verwendet für den Befehlszeileneditor
zusätzlich die Einstellungen aus der Konfigurationsdatei
.inputrc. Diese Datei wird zunächst im Home-Verzeichnis des
Anwenders gesucht, ist sie dort nicht vorhanden, wird im
Konfigurationsverzeichnis /etc/ nach der Datei
inputrc gesucht.
Eine nicht interaktive (Sub-) Shell, wie sie zum Start von Skripten
verwendet wird, liest keine Konfigurationsdateien ein, sofern dies
nicht explizit gefordert wird.
Einige Versionen der Bash (z. B. die von SuSE Linux verwendete)
suchen als interaktive Shell zunächst im Konfigurationsverzeichnis
/etc/ nach systemweit gültigen Einstellungen in der Datei
bash.bashrc. Diese ist aber normalerweise nicht
vorhanden bzw. leer. Anschließend und unabhängig davon, ob diese
Datei gefunden wurde, wird die persönliche Konfigurationsdatei
.bashrc im Home-Verzeichnis des Anwenders eingelesen.
Damit bei einer Login-Shell auch Funktionen einer interaktiven Shell
zur Verfügung stehen, wird am Ende der Login-Konfigurationsdatei oft
auch die persönliche Konfigurationsdatei im Home-Verzeichnis des Anwenders
eingelesen.
SuSE Linux löst die Konfiguration der Bash in folgender Weise: Die
systemweite Konfiguration erfolgt in der Datei /etc/profile,
an deren Ende weitere Konfigurationsdateien ausgeführt werden:
- /etc/SuSEconfig/profile
- alle Skripte in /etc/profile.d
- /etc/profile.local
Auch beim Verlassen der Shell können von der Bash noch automatisch
Befehle ausgeführt werden. Die Bash führt beim Eintreffen eines
exit-Befehls die Datei .bash_logout im
Home-Verzeichnis des Anwenders aus. Vorsicht: Nicht alle Versionen der
Bash werten diese Datei korrekt aus.
Die Ausführung der Dateien läßt sich über zwei Kommandozeilen-Parameter
steuern. Mit dem Parameter -noprofile veranlassen Sie, daß die Bash keine der
oben genannten Startdateien ausführt, mit -norc erreichen Sie, daß die
persönliche Konfigurationsdatei -/.bashrc ignoriert wird.
Der Prompt
Die Bash gibt einen Eingabeprompt aus, häufig in der Form Username:Pfad> .
Der Prompt ist über die Umgebungsvariable PS1 konfigurierbar. Ein Prompt in
der o. a. Form resultiert aus der Einstellung PS1=\u:\w\$ .
Um andere Einstellungen auszuprobieren, müssen Sie die Variable neu belegen.
Innerhalb dieser neuen Einstellungen können Sie einige spezielle Codes
verwenden:
Codes für die Konstruktion des Prompts |
Code | Wirkung |
\a |
Das Bell-Zeichen, wie es durch die Tastenkombination [Ctrl][g] erzeugt wird |
\d |
das aktuelle Datum im Format Thu Jan 18 |
\e |
das Escape-Zeichen |
\H |
der gesamte (Host) -Name |
\h |
der Rechner (Host) -Name bis zum ersten Punkt |
\n |
ein Newline (LineFeed) -Zeichen |
\r |
ein Return (Carriage Return) -Zeichen |
\s |
der Programmname der Bash, also bash |
\t |
die aktuelle Systemzeit im 24-Stundenformat HH:MM:SS |
\T |
die aktuelle Systemzeit im 12-Stundenformat HH:MM:SS |
\@ |
die aktuelle Systemzeit im 12-Stundenformat mit am/pm (01:39am) |
\u |
der Username |
\v |
die Version der ausgeführten Bash (2.03) |
\V |
Das Release der Bash, bestehend aus der Versionsnummer und dem Patchlevel (2.03.1) |
\w |
das aktuelle Arbeitsverzeichnis in ausführlicher Darstellung, beispielsweise ~/LinuxMagazin/bash/teil6 |
\W |
der letzte Teil des aktuellen Verzeichnisses, etwa teil6 |
\! |
die (History-) Nummer der aktuellen Befehlszeile |
\# |
die Nummer der Befehlszeile in der aktuellen Bash-Sitzung |
\$ |
mit diesem Schlüssen wird der Rootaccount gekennzeichnet. Wenn die effektive UID gleich Null ist, stellt die Bash das Hashmark dar, sonst ein Dollar-Zeichen |
\NNN |
Jedes beliebige ASCII-Zeichen kann durch Eingabe des oktalen Codes nach einem Backslash erzeugt werden |
\\ |
der Backslash selbst wird durch zwei Backslash-Zeichen erzeugt |
\[ |
eine Folge von Steuerzeichen wird so eingeleitet |
\] |
die Folge von Steuerzeichen wird so beendet |
Edieren der Kommandozeile
Die Hauptaufgabe einer Shell ist die Entgegennahme und Ausführung von Kommandos.
Zum Bearbeiten der aktuellen Kommandozeile stehen sowohl Emacs- als auch vi-kompatible
Editiermodi zur Verfügung - voreingestellt ist der Emacs-Modus. Wenn Sie lieber
im vi-Modus arbeiten, stellen Sie ihn durch den Befehl set -o vi ein, zurück
in den Emacs-Modus geht's mit set -o emcas. Im Emacs-Modus gibt es unter anderem
folgende Edierfunktionen:
- [Cursor links] beziehungsweise [Cursor rechts] bewegen den Cursor in
der Kommandozeile
- [Esc], [F] springt bis zum nächsten Wortende
- [Esc], [B] springt bis zum vorigen Wortanfang
- [Strg]+[E] springt zum Zeilenende
- [Strg]+[A] springt zum Zeilenanfang
- [Strg]+[K] löscht den Text ab der Cursorposition bis zum Ende der Zeile
- [Strg]+[Y] fügt den zuletzt gelöschten Text nach der Cursorposition ein
- [Tab] ergänzt ein Eingabefragment zum passenden Dateinamen.
Ist die Ergänzung nicht eindeutig möglich, ertönt ein Signalton und
Sie erhalten mit der Kombination
- [Tab], [Tab] eine Liste der in Frage kommenden Dateinamen
Abhängig von der eingesetzten Terminalemulation können Sie Kombinationen
mit der [Esc]-Taste oft auch mit der [Alt]-Taste nachgebilden.
Statt also nacheinander [Esc] und [F] zu drücken,
funktioniert meist auch die Kombination [Alt]+[F].
History-Mechanismus
In der Bash können Sie nicht nur die aktuelle Kommandozeile editieren, sie
merkt sich auch alle einmal eingegebenen Befehle in einer Datei, der
Kommandozeilen-History. Auch diese Datei befindet sich im Home-Directory des
Benutzers und heißt .bash_history. Mit den Cursortasten auf/ab
kann man in dieser Liste blättern. Darüber hinaus stehen folgende
History-Befehle zur Verfügung:
- [Strg]+[R] sucht nach dem letzten Kommando anhand der
Anfangsbuchstaben
- [Esc] oder "Cursor links" springt an den Anfang der History-Liste
- [Esc] oder "Cursor rechts" springt ans Ende der History-Liste
Die Anzahl der Befehlszeilen wird mit der Variablen HISTSIZE eingestellt.
Wächst die History darüber hinaus, verwirft die Bash die ältesten
Zeilen.
Wichtige interne Kommandos
Mittels set einstellbare Optionen der Bash
Option |
Name |
Funktion |
-a |
allexport |
neu
definierte oder veränderte Variablen werden automatisch exportiert |
-b |
notify |
bewirkt, dass Meldungen von Hintergrundjobs sofort ausgegeben
werden (voreingestellt wartet die Bash bis zur Ausgabe des nächsten
Prompts) |
-B |
braceexpand |
Klammerexpandierungen erlauben (entspricht der
Voreinstellung) |
-C |
noclubber |
Setzen dieser Option verhindert, dass bestehende
Dateien durch Ausgabeumleitungen (Redirections) zerstört werden |
-e |
errexit |
In diesem Modus beendet sich die Shell immer dann
automatisch, wenn ein Befehl einen Fehlercode erzeugte |
-f |
noglob |
Deaktiviert die Komplettierungsfunktion für Dateinamen |
-h |
hashall |
Deaktiviert das Speichern der Pfade bereits einmal
ausgeführter externer Befehle; ein Abschalten bewirkt längere
Ausführungszeiten bei Skripten |
-H |
histexpand |
Erlaubt erweiterte Ersetzungen aus dem Historybuffer
(voreingestellt: on) |
-k |
keyword |
Zuweisungen werden in das Environment des Befehls übernommen |
-m |
monitor |
Aktiviert die Job-Kontrollfunktionen (Voreinstellung:
on bei interaktiven Shells) |
-n |
noexec |
Verhindert die Ausführung von Befehlen; die Syntax wird
aber überprüft und gegebenenfalls Fehlermeldungen erzeugt (deaktiviert
bei interaktiven Shells) |
-o |
Option |
setzt die im Argument übergebene Option, siehe
das Beispiel oben |
-p |
privileged |
Aktiviert den privilegierten Modus |
-P |
physical |
Unterdrückt die Darstellung von symbolischen Links,
statt dessen wird das physikalische Verzeichnis verwendet |
-t |
onecmd |
Die Shell terminiert nach dem Ausführen des ersten Befehls |
-u | nounset |
Bewirkt, dass ungesetzt
Variablen Fehlermeldungen erzeugen; ohne diese Option wird ihnen ein
leerer Inhalt zugewiesen |
-v |
verbose |
Befehlszeilen werden angezeigt, bevor sie ausgeführt werden |
-x |
xtrace |
Alle Befehlszeilen werden mit expandierten Argumenten
angezeigt, bevor sie ausgeführt werden |
Mit der Einführung der Bash-Version 2.0 gibt es viele neue
Konfigurations-Features. Sie werden durch den "erweiterten
Konfigurationsbefehl" shopt gesetzt oder angezeigt.
Die aktuellen Optionen sind über die Variable SHELLOPTS zugänglich.
Der Befehl verfügt über folgende Optionen: -p
(print) gibt eine Liste der aktuellen Einstellungen aus, -s
(set) setzt die im Argument angegebene Option, -u (unset)
löscht sie. Durch -q (quiet) wird die Ausgabe des Befehls
unterdrückt, wie dies in Skripten praktisch sein kann. Durch
-o beschränkt sich die Wirkung von shopt auf die
durch set -o gesetzten Optionen. In der folgenden Tabelle
sind nur die wichtigsten mittels shopt einstellbaren Bash-Optionen
aufgeführt, eine vollständige Liste enthält die Manual-Page.
Option |
Funktion |
cdable_vars |
bewirkt, dass die Bash Argumente des cd-Befehls
als Variablen interpretiert, wenn es sich um keine Verzeichnisse
handelt |
cdspell |
einfache Schreibfehler
(vertauschte oder fehlende Buchstaben)
in Verzeichnisnamen werden durch diese Option automatisch korrigiert |
checkhash |
die Bash sucht einen externen Befehl zunächst in der
Hashtabelle, bevor er anhand des Suchpfades gefunden wird |
checkwinsize |
wenn diese Option aktiviert ist, prüft die Bash nach jedem
ausgeführten Befehl, ob sich die Terminal-Abmessungen geändert haben. |
cmdhist |
zusammengehörige Befehlszeilen werden in der History in Form einer
Zeile abgelegt, dadurch vereinfacht sich ihre Bearbeitung |
dotglob |
durch das Setzen dieser Option werden auch die mit einem Punkt
beginnenden Dateinamen beim automatischen Komplettieren berücksichtigt |
execfail |
verhindert in Skripten, dass die Shell nach einem Fehler
in einem exec-Befehl terminiert |
histexpand |
bewirkt, dass Historydateien nicht mehr überschrieben,
sondern an bestehende Dateien angehängt werden |
lithist |
zusammen mit cmdhist bewirkt sie das Zusammenfassen
mehrzeiliger Befehle |
sourcepath |
der source-Befehl kann auf die
PATH-Variable zugreifen, wenn diese Option gesetzt ist |
expand_aliases |
erlaubt das Expandieren von Alias-Definitionen |
nocaseglob |
bei der automatischen Dateinamenkomplettierung
berücksichtigt die Bash Groß-/Kleinschreibung nicht, wenn diese Option
aktiv ist |
huponexit |
allen von einer interaktiven Shell ausgeführten
Hintergrundjobs wird ein SIGHUP-Signal gesendet, wenn sie terminiert |
restricted_shell |
die Bash wird im Restricted-Modus mit
eingeschränkter Funktionalität betrieben |
|
|
|