Bash (Shell)
Bash (auch BASH oder bash), die Bourne-again shell, ist eine freie Unix-Shell unter GPL. Als Shell ist Bash eine Mensch-Maschine-Schnittstelle, die eine Umgebung (englisch environment) bereitstellt, in der zeilenweise Texteingaben und -ausgaben möglich sind. Letzteres erfolgt über die Befehlszeile, in die Befehle eingetippt und durch Betätigen der Eingabetaste eingegeben werden. Gleichzeitig ist Bash eine Skriptsprache, die schon beim Booten vieler Linux-Distributionen zum Einsatz kommt. Bash ist elementarer Bestandteil des unixähnlichen Betriebssystems GNU und gehört zum GNU-Projekt. Auch bei den meisten auf GNU/Linux aufbauenden Betriebssystemen ist Bash die voreingestellte Shell. Darüber hinaus war Bash 3.x von 2003 bis 2019 die voreingestellte Shell in macOS von Apple (10.3–10.14) – wurde allerdings aus lizenzrechtlichen Gründen nie auf Version 4.0 oder höher aktualisiert. Der Name Bash ist im Englischen mehrdeutig ([to] bash, [the] bash) und erfuhr im Laufe der Zeit weitere, meist humoristische Bedeutungen. GeschichteBrian Fox schrieb die Bash 1987 für das GNU-Projekt und wurde dabei von der FSF bezahlt.[4] 1990 wurde das Projekt 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 ( FunktionalitätVergleich mit anderen ShellsDie Shell ist weitgehend kompatibel zur Bourne-Shell (sh) und beherrscht zusätzlich sowohl die meisten Funktionen der Kornshell (ksh) als auch Teile der C-Shell-Syntax, wie zum Beispiel die Historie zuvor eingegebener Befehle, die SubshellEine Subshell ist ein Shellprozess, der von einer Shell erzeugt wurde. Programme, die durch Eingabe eines Kommandos in eine Shell zur Ausführung gebracht werden, werden betriebssystembedingt in einer Subshell gestartet: Bevor die Shell ein Programm als Kindprozess starten kann, muss sie einen Shellprozess erzeugen. Bei der Ausführung eines Programms aus der grafischen Benutzeroberfläche heraus ist jedoch keine Shell oder Subshell involviert. Subshells werden automatisch bei der Verwendung einer Reihe von Bashfeatures erzeugt. Beispielsweise werden alle Befehle einer Pipeline in einer eigenen Subshell ausgeführt. Shells in grafischen Oberflächen, wie Login-ShellWird die Bash mit einem Programm gestartet, das der Anmeldung an der Konsole dient, wie z. B. KonfigurationDie Bash wird durch eine Reihe von Konfigurationsdateien konfiguriert. Hierbei ist zu unterscheiden zwischen systemweiter und benutzerspezifischer Konfiguration.
Die systemweiten Einstellungen der Bash werden — je nach Distribution — in der Im Verzeichnis Eingebaute BefehleDie Bash enthält zahlreiche eingebaute Befehle und reservierte Wörter. Zu den eingebauten Befehlen zählen beispielsweise PlatzhalterAls Platzhalter verwendet die Bash den user1@blablubb:~/test$ ls datei*
datei datei1 datei2 datei3 datei4 datei5 datei6 # Auch 'datei' ohne Nummer
user1@blablubb:~/test$ ls datei?
datei1 datei2 datei3 datei4 datei5 datei6
user1@blablubb:~/test$ ls datei[1-3] # Wertebereich
datei1 datei2 datei3
user1@blablubb:~/test$ ls datei[135] # Wertemenge
datei1 datei3 datei5
user1@blablubb:~/test$ touch test{1..5} # Wertebereich für Klammerexpansion
user1@blablubb:~/test$ ls test*
test1 test2 test3 test4 test5
user1@blablubb:~/test$
Ein- und Ausgabe, UmleitungWie in Unix üblich, unterstützt die Bash die Umlenkung der drei Standard-Datenströme (auch Standardkanäle), die mittels der sogenannten Dateideskriptoren gehandhabt werden. Es sind dies die Standardeingabe user@blablubb:~/test$ ls -l /root ~/test
/home/user/test:
insgesamt 0
-rw-r--r-- 1 user1 users 0 Feb 11 20:03 datei1
-rw-r--r-- 1 user1 users 0 Feb 11 20:03 datei2
ls: Öffnen von Verzeichnis /root nicht möglich: Keine Berechtigung
Die Kanäle können auch kürzer über ihre Nummern angesprochen werden.
Die Standardkanäle können auch umgeleitet werden, indem hinter dem jeweiligen Kommando die Umlenkzeichen user@blablubb:~/test$ ls -l /root ~/test >ls.txt 2>ls_err.txt
Nachfolgend wird die Standardausgabe von user@blablubb:~/test$ ls *.txt > verzeichnis.info
user@blablubb:~/test$ less < verzeichnis.info
Mit der Pipe (|) lassen sich Kommandos verketten, indem die Ausgabe des ersten mit der Eingabe des zweiten Kommandos verbunden wird, was sich (fast) beliebig verlängern lässt: user@blablubb:~/test$ ls -l /etc | grep '^d' | wc -l
Der Mechanismus der Umlenkung der Standardkanäle und die Pipe sind keine Besonderheit der Bash. set-OptionenDie Bash verfügt über 27 Optionen, mit denen ein anderer Betriebsmodus eingestellt werden kann. Alle möglichen Einstellungen können mit user$ set -o
aufgelistet werden, wobei mit der Option Das Überschreiben der Ausgabeumleitung wird unterdrückt: user$ echo "hallo" > hallo.txt
user$ echo "hallo" > hallo.txt
user$ set -o noclobber
user$ echo "hallo" > hallo.txt
-su: hallo.txt: Kann existierende Datei nicht überschreiben.
user$ set +o noclobber
user$ echo "hallo" > hallo.txt
Man kann Dateinamen mit Stern und Fragezeichen erzeugen. Vor der Abfrage mit user$ set -o noglob
user$ touch da*tei.sh
user$ touch dat?ei.sh
user$ set +o noglob
user$ ls *sh
da*tei.sh dat?ei.sh
Die dritte Zeile zeigt die von der Bash vorgenommenen Erweiterungen an: user$ set -o xtrace
user$ ls *.txt
+ ls --color=auto hallo.txt test.txt text.txt
hallo.txt test.txt text.txt
Alle Optionen können auch mittels einer Kurzschreibweise gesetzt werden, beispielsweise ist UmgebungsvariablenIn der Bash können Variablen auf mehrere Arten definiert werden. Grundsätzlich unterscheidet man zwischen „lokalen“ Variablen, die nur in der Shell gelten, in der sie definiert wurden, und „globalen“ Variablen, die auch in Sub-Prozessen zugewiesen sind. Lokale Variablen können erzeugt werden mit: user$ var=var1
user$ var='var zwei'
user$ let var=var3
user$ declare var=var4
und globale Variablen werden definiert mit: user$ declare -x var=var5
user$ export var=var6
Angesprochen werden die Variablen mit dem user$ echo $var
Statt „globale Variable“ ist allerdings im Unix-Umfeld der Ausdruck „Umgebungsvariable“ sehr viel geläufiger und passender, weil in manchen Programmiersprachen der Ausdruck „globale Variable“ eine andere Bedeutung als „Umgebungsvariable“ hat. Eine Wertzuweisung für eine „Umgebungsvariable“ wirkt nur auf „Unterprogramme“ (Kindprozesse), während manche Programmiersprachen es erlauben, Variablenwerte auch für „Oberprogramme“ zu setzen (etwa durch Voranstellen von Eigene UmgebungsvariablenDie Bash verfügt über zahlreiche eigene Umgebungsvariablen, die auch häufig von anderen Kommandos ausgewertet werden. Bekannt sind die Variablen Beispielsweise können die englischsprachigen Hilfeseiten des Programms user$ LANG=en man ls
ProgrammierungBash-Programmierung unterscheidet sich in vielen Punkten von anderen Programmiersprachen. So wird beispielsweise bei der Verzweigung traditionell die Bedingung nicht von der Shell selbst ausgewertet, sondern an ein weiteres Programm übergeben: if [ Bedingung ] ; then
# Falls Bedingung wahr ist, wird dies ausgeführt
else
# Falls Bedingung falsch ist, wird dies ausgeführt
fi
Die beiden eckigen Klammern sind keine Begrenzer, sondern ein Synonym für den integrierten (builtin) Shell-Befehl if test Bedingung ; then
# Falls Bedingung wahr ist, wird dies ausgeführt
else
# Falls Bedingung falsch ist, wird dies ausgeführt
fi
Heutzutage existiert jedoch auch ein eingebauter Ausdruck, der ohne externen Befehl auskommt, daher nicht mehr den Beschränkungen unterliegt, denen die Befehlsform unterlag, und so unter anderem auch keine Anführungszeichen um Variablen mehr benötigt: if [[ Bedingung ]] ; then
# Falls Bedingung wahr ist, wird dies ausgeführt
else
# Falls Bedingung falsch ist, wird dies ausgeführt
fi
Hier kann die Bedingung nun z. B. auch Operatoren wie Diese Variante wird daher, wenn keine Kompatibilität zu älteren Versionen benötigt wird, generell empfohlen. Jedoch kann auch weiterhin der Rückgabewert (0–127, wobei >0 = falsch) eines beliebigen Programmes verarbeitet werden. Nicht nur der des if kill -0 1234 ; then
# Prozess 1234 läuft
else
# Prozess 1234 läuft nicht
fi
SicherheitIm September 2014 wurde eine gravierende Sicherheitslücke unter dem Namen Shellshock bekannt. Die seit langem bestehende Lücke ermöglicht, dass beim Start einer neuen Shell Schadcode, der per Umgebungsvariable eingefügt wurde, ungeprüft ausgeführt wird.[8] Die Lücke gilt seit Oktober 2014 als geschlossen.[9][10] Literatur
WeblinksWikibooks: Linux-Praxisbuch/ Shellprogrammierung – Lern- und Lehrmaterialien
Einzelnachweise
|