Seit Januar 2019 ist Bash 5.0 allgemein verfügbar. Dieses aktuelle Major-Release ist ca. 10 Jahre nach dem Major-Release 4 erschienen. In diesem Artikel sollen einige praktische Unterschiede zur vorherigen Version Bash 4.4 aus dem Jahr 2016 dargestellt werden.
Historie
Bei der Bash (Bourne-again Shell) handelt es sich um einen Kommandozeileninterpreter. Die Entwicklung begann 1987 (Brian Fox) für das GNU-Projekt und wurde 1990 von Chet Ramey weitergeführt. Aktuellste Version ist die Version 5.0.
Bash 5.0
In der Hauptsache wurden Bugfixes zur Version 4.4 durchgeführt. Es gibt jedoch auch einige Neuerungen. Die interessantesten werden in diesem Artikel vorgestellt.
Variablen
Anzahl der Sekunden seit der UNIX-Epoche (1.1.1970, Mitternacht UTC/GMT) ; (entspricht „date +%s")
EPOCHREALTIME:
dto. , aber mit zusätzlicher Ausgabe von Mikrosekunden; (entspricht „date +%s.%6N")
BASH_ARGV0:
Name der Shell oder eines ausgeführten Shell-Skripts (Interaktion mit $0)
Beim Ändern der Variablen BASH_ARGV0 wird auch die Variable $0 mit verändert. Grund hierfür ist: beim Debuggen kann es nützlich sein, $0 auf verschiedene Werte zu setzen. Dies führte vor zehn Jahren zum Vorschlag vom BASH Debugger Rocky Bernstein dazu, es in die BASH einzubauen.
Man könnte sich fragen, warum eine neue Variable benötigt wird, anstatt es $0 direkt zuzuweisen. Da 0 jedoch kein gültiger Variablenname ist, wäre es weit aufwändiger es dort einzubauen und auch inkompatibel mit den Vorgängerversionen! Die Variable $0 erlaubt ja nur ihren Wert zu lesen. Vor der BASH 5 konnte es nur beim Starten der Shell gesetzt werden. Mit BASH_ARGV0 kann man den Wert nun sowohl lesen als auch schreiben.
Beispiele:
Ändern der $0-Variablen:
Shell Builtin Kommandos
Bei einen Builtin Kommando der Shell handelt es sich um ein Kommando, welches in der Shell eingebaut ist. Diese Kommandos werden im RAM geladen und sind dadurch vom Zugriff schneller im Vergleich zu externen Kommandos, die von der Platte geladen werden müssen. Builtin Kommandos können auch dynamisch geladen werden.
Syntax:
Anzeige, ob Builtin Kommandos enabled/disabled sind
Disabled ein geladenes Builtin Kommando
Enabled ein geladenes Builtin Kommando
Lädt dynamisch ein Builtin Kommando
Entfernt ein dynamisch geladenes Builtin Kommando
Syntax:
enable -a
enable -n name
enable name
enable -f datei name
enable -d name
Die Anzahl der Builtin Kommandos hat sich leicht erhöht (s.u.) und es wurden auch Änderungen an einigen vorhandenen Builtin Kommandos eingebaut:
Shell builtin Kommando history:
Mit diesem Kommando kann man sich die letzten ausgeführten Kommandos (max. $HISTSIZE) anzeigen lassen und auch die History-Liste bearbeiten.
Neu in der BASH 5 ist, dass man nun auch Bereiche entfernen kann, nicht nur wie vorher einzelne Elemente:
Syntax:
history -d START-END
Beim Löschen von einzelnen Elementen lassen sich nun aber auch negative Offsets verwenden.
Beispiele:
Löschen der Einträge 100 bis 200
Löschen der letzten 10 Einträge (genauer von -10 bis -1)
Löschen des 3. letzten Kommandos
$ history -d 100-200
$ history -d -10–-1
$ history -d -3
Shell builtin Kommando wait
Neue Option -f bedingt, dass gewartet wird bis der Job oder der Prozess terminiert und nicht nur bis der Status sich ändert. Shell Builtin Kommando umask
umask akzeptiert nun auch 4-stellige oktal-Werte - was bei vielen anderen Shells ( ksh, dash, sh, zsh, … ) schon längere Zeit möglich war - wobei aber nur 3 Stellen interpretiert werden:
Beispiel:
Shell Builtin Kommando times
Dieses Kommando zeigt den Zeitverbrauch an. Es gibt den akkumulierten Benutzer- und Sysemzeitverbrauch der Shell und aller von ihr gestarteten Prozesse aus. Es berücksichtigt jetzt die auch Sprachumgebung, genauer locale, so dass Dezimalzahlen je nach Sprachumgebung mit Punkt oder Komma dargestellt werden, so wie es das Laufzeit-Mess-Kommando „time" schon länger macht.
Beispiel
Es gibt vier neue "loadable" Builtin Kommandos:
rm; stat; fdflags; seq
Diese können aktuell nur eingesetzt werden, wenn man den Quellcode der BASH 5 installiert hat. Dazu müssen sie zuerst per make generiert werden:
Das Builtin Kommando rm arbeitet recht analog zum gleichnamigen Unix Kommando, kennt aber nicht die gleichen Argumente (es fehlen -I -d und -v ).
So werden die generierten Shell-Builtins aktiviert, bzw. deaktiviert:
Beispiel:
Das Builtin Kommando stat arbeitet auch analog zum gleichnamigen Unix Kommando, besitzt aber auch nicht die gleichen Optionen. Es schreibt sogar per default die Ausgabe in ein Array dessen Namen man mit der Option -A definieren kann, ansonsten wird der Array-Name STAT verwendet.
Beispiel:
Das Builtin Kommando fdflags zeigt an, bzw. ändert Filedeskriptoren eines Ein-/Ausgabekanals.
Das Kommando seq dient dazu Zahlen schrittweise auszugeben. Das Builtin Kommando ist aber nicht so einsatzfähig wie das binäre Kommando:
Beispiel:
Readline Variable
Wird die Variable completion-ignore-case gesetzt (die schon in der BASH 2 eingeführt wurde) , werden nun auch Shell-Funktionen und Aliase case-insensitv per TAB-Taste erkannt; bisher nur Datei- und Verzeichnisnamen
shopt Optionen (Auswahl)
Bei shopt handelt es sich um ein Builtin Kommando mit dem das Verhalten der Shell geändert werden kann.
Syntax:
$ shopt
- Ohne Option werden alle shopt Optionen angezeigt.
- Mit der Option -s können Optionen auf on (enabled) gesetzt werden.
- Mit der Option -u können Optionen auf off (disabled) gesetzt werden.
Neue bzw. geänderte shopt Optionen:
Neu sind bei Bash 5.0 die folgenden 5 Optionen, so dass nun insgesamt 53 zur Verfügung stehen:
assoc_expand_once off
compat44 off
localvar_inherit off
localvar_unset off
progcomp_alias off
Geändert wurde bei der Bash 5.0 eine Standardeinstellung, die vorher deaktiviert war:
globasciiranges on
Damit werden Bereiche in Klammerausdrücken [..] wie bei C locale ausgewertet.Beispiel:
Falls off: Bereiche werden entsprechend der "local collecting sequence" ausgewertet, (d.h. Variable $LANG, genauer locale wird ausgewertet)
Beispiel:
Die shopt Option localvar_inherit ist per default off. Falls sie aktiviert wird, können lokale Variable in einer Funktion den Wert aus vorheriger Umgebung erben.Beispiel:
Funktionsaufruf:
Alle weiteren shopt-Optionen können in den Man Pages nachgelesen werden. Fazit
Es gibt einige ganz interessante neue Features mit Bash 5.0., z.B.die Möglichkeit, beim buildin-Kommando history ganze Bereiche löschen zu können. Im Vergleich zu der Menge der mit der Version 4 eingeführten Neuerungen ist es aber aktuell noch deutlich weniger …
Es wurden aber auch einige Fehler behoben, die im Laufe der Jahre festgestellt wurden (siehe z.B. www.git.savanah.gnu.org) Es wird noch einige Zeit dauern bis auf allen Linux Distributionen bash 5.0 zur Verfügung steht, da typischerweise gewartet wird, bis sich die Stabilität der Version etabliert hat. Eine der aktuell wenigen Ausnahmen ist "Debian GNU/Linux" der VERSION 10 (buster).
Ansonsten kann man sich die neue Version aus dem Git-Repository hier herunterladen und auf dem System kompilieren und installieren.