Bash/Grundlagen
Bourne-again shell (bash)
- Die Bourne-again shell (bash) ist eine freie Unix-Shell und Teil des GNU-Projekts.
- Die Bash wird von der Free Software Foundation entwickelt und ist die Standardshell des GNU-Betriebssystems HURD.
Der Name
- Der Name ist absichtlich mehrdeutig und bedeutet unter anderem „wiedergeborene (born again) Shell“, „wieder einmal (eine) Bourne-Shell“ oder auch aus dem Englischen to bash (schlagen, kritisieren, schlecht machen).
Geschichte
- Die Bash ist die mit Abstand beliebteste Shell unter Linux. Zum Teil mag das an ihrer frühen Verfügbarkeit liegen, während freie Implementierungen der Tcsh und Ksh für Linux erst nachzogen.
- Entscheidend scheint der enthaltene Funktionsumfang, den die anderen Shells nicht annähernd mit sich bringen und die Konformität mit dem IEEE POSIX P1003.2/ISO 9945.2 Shell und Tools Standard. Hierin ist auch der Grund für die Unterschiede zur Bourne Shell (sh bzw. bsh) zu sehen.
- Auch wenn der Name Bash die enge Verwandtschaft zur Bsh nahe legt, so hat die GNU Bash gleich drei Vorfahren. Die eben genannte Bsh, die Csh und die Ksh. Von jedem erbte die Bash die Konstrukte, die sich aus der Erfahrung heraus als besonders nützlich erwiesen hatten.* Geschrieben wurde bash 1987 von Brian Fox und wurde 1990 von Chet Ramey übernommen.
- Version 3 erschien am 27. Juli 2004.
- Version 4 erschien am 20. Februar 2009 und brachte einige Neuerungen mit sich. Darunter sind eine neue Ausgabeumleitung, assoziative Arrays und eine neue Wildcard (**).
Verbreitung
Die Bash (/bin/bash) ist die Standard-Shell sowohl auf den meisten Linux-Systemen als auch unter Mac OS X und wurde auf fast alle Unix-Systeme portiert. Sie ist heute auf vielen unixoiden Systemen die Standard-Shell. Für Windows existieren zahlreiche Portierungen. Die bekanntesten sind:* Cygwin
- MSYS (Minimal SYStem)
- Microsoft Windows Services for UNIX
Fähigkeiten der Bash
- Das GNU Projekt (GNU's Not UNIX) stellt Werkzeuge für die Administration UNIX-ähnlicher Systeme zur Verfügung, die freie Software und kompatibel zu UNIX Standards sind. Bash ist ein Sh-kompatible Shell, die nützliche Funktionen der Korn shell (ksh) und der C shell (csh) übernommen hat.
- Die Bash wurde geschrieben um konform zum 'IEEE POSIX P1003.2/ISO 9945.2 Shell and Tools standard' zu sein, sie st größtenteils kompatibel zur originalen Bourne-Shell (sh), im Funktionsumfang jedoch erheblich erweitert und Verbesserungen bei der Programmierung und der interaktiven Nutzung.
- Die Shell ist weitgehend kompatibel zur Bourne-Shell (sh) und beherrscht zusätzlich sowohl die meisten Funktionen der Korn-Shell (ksh) als auch Teile der C-Shell (csh)-Syntax, wie zum Beispiel die „Command-History“, die $RANDOM-Variable und die POSIX-Form der Command-Substitution $(...) wurden übernommen.
- Auch wurde sie um Funktionen wie z. B. der Ganzzahlarithmetik ohne die Ausführung externer Prozesse und Vereinfachung der I/O-Umleitungen erweitert.
- Bash bietet außerdem die Möglichkeit, in der Datei ~/.bashrc eigene Einstellungen wie Designs zu speichern.
- Vor allem beherrscht sie einen Großteil der Fähigkeiten der ksh und versteht auch Teile der Syntax der csh, wie zum Beispiel die Command-History, den Directory-Stack, die $RANDOM-Variable und die POSIX-Form der Command-Substitution $(…).
Daneben sind auch eine ganze Reihe eigene Erweiterungen implementiert.* Editieren der Kommandozeile
- Kommandozeilenspeicher (unlimited size command history)
- Steuerung von Prozessen (job control)
- Eingabevervollständigung
- Geringe Fehler in der Eingabe können automatisch korrigiert werden.
- Die Eingabeaufforderung ist konfigurierbar.
- Berechnungen analog zu C werden unterstützt (integer arithmetic in any base from two to sixty-four)
- Aliase und Funktionen (shell functions and aliases)
- Felder (indexed arrays of unlimited size)
- Die Bash kann die meisten Sh-Skripte ohne Anpassungen ausführen
Bedingungen
- Bedingte Ausdrücke können durch das [[ compound command sowie dem internen test und [ - Kommando.
- Ausdrücke können unär oder binär sein. Unäre Ausdrücke werden oft benutzt, um den Status einer Datei zu ermitteln.
- Es wird nur eine Objekt benötigt (z.B. eine Datei), um solche Operationen durchzuführen.
- Außerdem gibt es Zeichenketten- und nummerische Vergleichsoperatoren; dies sind binär und erfordern zwei Objekte für die Operation.
- Wenn das FILE-Argument von der Form /dev/fd/N ist, wird der file descriptor N geprüft.
- Ist FILE /dev/stdin, /dev/stdout oder /dev/stderr, werden die file descriptors 0, 1 or 2 geprüft.
Shell Arithmetik
- Die Shell kann arithmetische Ausdrücke als Shell-Ausdruck oder mit dem internen Befehl let prüfen.
- Die Prüfung wird als fixed-width integers ohne overflow-Prüfung durchgeführt. Divisionen durch Null werden gefangen (trapped) und als Fehler markiert.
- Operatoren und ihre Rangfolge und Assoziativität entsprechen der Programmiersprache C.
Aliase
- Aliase erlauben es eine Zeichenkette zu ersetzten, wenn sie das erste Wort eines einfachen Kommandos sind.
- Die Shell hält eine Liste von Aliasen, die mit alias und unalias gesetzt bzw. gelöscht werden können.
- Die Bash liest immer mindestens eine ganz Zeile ein, bevor eines der Kommandos ausgeführt wird.
- Aliase werden expandiert, wenn ein Kommando gelesen wird, nicht, wenn es ausgeführt wird. Dadurch haben Aliasdefinition in der gleichen Zeile keinen Effekt, bis die nächste Zeile eingelesen wird.
- Kommandos die in der gleichen Zeile auf eine Aliasdefinition folgen, haben keinen Einfluss auf den neuen Alias.
- Aliase werden expandiert wenn eine Funktionsdefinition gelesen und nicht, wenn sie ausgeführt wird, weil eine Funktionsdefinition selber eine compound command ist.
- Folglich sind Aliase, die innerhalb einer Funktion definiert werden erst verfügbar, wenn die Funktion ausgeführt wurde.
Arrays
- Die Bash stellt eindimensionale Array-Variablen zur Verfügung
- Jede Variable kann als Array genutzt werden. Das interne Kommando declare deklariert explizit ein Array.
- Es gibt weder ein Limit für die maximale Größe eines Arrays, noch die Anforderung, dass Mitglieder indiziert oder kontinuierlich sein müssen.
- Der Array-Index beginnt bei Null.
Verzeichnisstapel
- Der Verzeichnisstapel (directory stack) ist eine Liste der zuletzt besuchten Verzeichnisse.
- Das interne Kommando pushd fügt dieser Liste ein Verzeichnis hinzu und wechselt in das Verzeichnis. Das interne Kommando popd entfernt das angegebene Verzeichnis von dem Stapel und wechselt in das entfernte Verzeichnis.
- Der Inhat des Verzeichnisstapels kann mit dem internen Kommando dirs oder durch auslesen der Variable DIRSTACK angezeigt werden.
- Weiter Informationen zur Arbeit mit diesem Mechanismus können der Infopage der Bash entnommen werden.
Eingabeaufforderung (Prompt)
- Der Eingabeaufforderung (Prompt) der Bash kann umfangreich konfiguriert werden.
Shell Syntax
- Wenn die Eingabe nicht auskommentiert wurde, liest die Shell sie und teilt sie in Wörter und Operatoren mit Hilfe von Maskierungsregeln, um die Bedeutung jedes Eingabezeichens festzulegen.
- Danach werden diese Wörter und Operatoren in Kommandos und andere Konstruktionen übersetzt, die einen Rückgabewert (exit status) erzeugen, um die Verarbeitung zu inspizieren.
Dieses fork-and-exec Schema wird nur angewandt, nachdem die Shell die Eingabe wie folgt analysiert hat:* Die Shell liest ihre Eingabe aus einer Datei, einem string oder vom Benutzerterminal.
- Die Eingabe nah den Maskierungsregeln wird in Wörter und Operatoren zerlegt. Diese Token werden durch Metazeichen getrennte. Die Alias-Ersetzung wird durchgeführt.
- Die Shell parst (Analyse und Substitution) die Token in einfache und zusammengesetzte Kommandos.
- Die Bash führt verschiedene Ersetzungen (expansions) durch und zerlegt die expandierten Token in Dateiliste, Kommandos und Argumente.
- Wenn notwendig, wird eine Umleitung durchgeführt und die Umleitungs-Operatoren und -Ziele werden aus der Argumenteinliste entfernt.
- Die Kommandos werden ausgeführt.
- Gegebenenfalls wartet die Shell bis das Kommandos beendet wurden und sammelt ihren Rückgabewert.
Shell Kommandos
- Ein einfaches Shell Kommando wie touch file1 file2 file3 besteht aus dem Kommando selber, gefolgt von Argumenten, getrennt durch Leerzeichen.
- Komplexere Shell-Kommandos werden auf verschiedene Weise aus einfachen zusammengesetzt: Durch Pipelines, die die Ausgabe eines Kommandos an das nächste weiterreicht, durch Schleifen, Bedingungen oder andere Gruppierungen. Ein paar Beispiele
ls | more gunzip file.tar.gz | tar xvf -
Shell Funktionen
- Shell Funktionen sind ein Weg Kommandos zu gruppieren, um sie später durch einen Namen aufzurufen.
- Sie werden ausgeführt, wie ein „normales“ Kommando. Wenn der Name einer Shell-Funktion als einfaches Kommando genutzt wird, wird die Liste der hinterlegten Kommandos ausgeführt.
- Shell-Funktionen werden im aktuellen Shell-Kontext ausgeführt; es wird kein neuer Prozess erzeugt um sie zu interpretieren.
Shell Parameter
- Eine Shell-Variable ist eine Entität, die einen Wert speichert. Das kann ein Name, eine Zahl oder ein spezieller Wert sein. Für die Shell eine Variable ist in Parameter, der einen Namen speichert. Eine Variable hat einen Wert und null oder mehrere Attribute. Variablen werden mit dem eingebauten Kommando declare erzeugt.
- Wird kein Wert übergeben enthält sie einen null string. Variablen können nur mit dem internen unset gelöscht werden.
Shell Expansionen
- Folgende Shell-Expansionen werden durchgeführt, nachdem die Kommandozeile in Token zerlegt wurde:* Auflösung von Aliasen
- Klammer-Expansion
- Tilde-Expansion
- Parameter- und Variablenexpansion
- Kommandosubstitution
- Arithmetische Substitution
- Wortaufteilung
- Pfadnamensexpansion
Umleitungen
- Bevor ein Kommando ausgeführt wird, werden eventuell seine Ein- und Ausgabe durch spezielle Notationen, die durch die Shell interpretiert werden, umgeleitet.
- Umleitungen können auch genutzt werden, um Dateien für die aktuelle Shell-Umgebung zu öffnen oder zu schließen.