AA_shell_timobalk_sxc_1190362.jpg

© timobalk, sxc.hu

Im Innern der Muschel

Neue Programmiertechniken und Funktionen in Bash 4

14.05.2010
Mit der Version 4 erhält die Bourne Again Shell (Bash) neue Funktionen, die sie einmal mehr als leistungsfähige Programmierschnittstelle zum System und zu Applikationen qualifiziert.

Seit einiger Zeit bringen die Linux-Distributionen die Bourne Again Shell (Bash) in Version 4 mit. Sie löst damit in vielen Fällen die Version 3.2 ab, deren Eigenschaften sie weitgehend übernimmt und erweitert. Seit Januar 2010 gibt es zudem die Version 4.1, die wieder eine ganze Reihe von Neuerungen enthält. Es steht zu erwarten, dass die Distributionen ihre nächsten Releases mit dieser Version ausliefern.

Wer nicht so lange warten möchte, installiert sich die aktuelle Version schnell und einfach aus den Quellen (siehe Kasten "Bash kompilieren und installieren"). Wie immer spielen sich einige der Veränderungen unter der Oberfläche und für den Anwender kaum erkennbar ab. Ein Menge Neuerungen erleichtert Ihnen aber dem Umgang mit der Shell ganz erheblich.

Bash kompilieren und installieren

Das Archiv mit den Quelltexten finden Sie im Netz unter http://tiswww.case.edu/php/chet/bash/bashtop.html. Beim Auspacken entsteht das Verzeichnis bash-4.1 im aktuellen Verzeichnis. Wechseln Sie dorthin und erstellen Sie mittels ./configure ein Makefile. Mit dem Befehl make bauen Sie die Komponenten. Ein make test überprüft das Ergebnis, mit su -c 'make install' installieren Sie die Software unter /usr/local/bin/ auf dem Rechner.

Haben Sie die Suchreihenfolge der Shell so konfiguriert, dass Sie zuerst in /usr/local/bin/ nach Binaries schaut, kommt nun die neue Shell per Default zum Einsatz. Andernfalls rufen Sie diese unter Angabe des vollen Pfades auf.

Neue Shell-Optionen

Shell-Optionen steuern grundlegende Eigenschaften der Bash, wie etwa die Interpretation von Metazeichen, die History-Funktion oder das Verhalten von Hintergrundprozessen. Mit den Befehlen set und shopt aktivieren oder deaktivieren Sie diese Optionen im laufenden Betrieb. Alternativ geben Sie die Optionen wie zum Beispiel bei bash -o noexec als Argumente für den Parameter -o beim Start an. In dieser Form führt die Shell ein als Argument übergebenes Skript nicht aus, sondern untersucht nur dessen Syntax auf grobe Fehler.

Die Bash kennt zwei Varianten von Shell-Optionen: Die klassischen, die mehr oder weniger kompatibel zur Ur-Shell arbeiten, steuern Sie mit set. Die neueren, die die Bash erweitern und oft auch bei der Zsh existieren, beeinflussen Sie über den Befehl shopt.

Das Kommando set erlaubt es, mittels -o Optionen über deren Namen zu setzen. Möchten Sie eine Option auf diese Weise setzen, verwenden Sie set -o Name in einem Skript oder Terminal. Setzen Sie statt des Minuszeichens ein Pluszeichen, dann deaktivieren Sie die entsprechende Option.

Bei den erweiterten Optionen verhält es sich etwas anders: Mit dem Parameter -s setzen Sie eine Option, wohingegen -u die Option deaktiviert. Das Kommando shopt Option zeigt den aktuellen Zustand der Option. Ohne Argumente gibt der Befehl Informationen über alle erweiterten Shell-Optionen aus, mit shopt -p erhalten Sie dagegen eine Ausgabe, die sich gleichzeitig als Eingabe eignet.

Die neue Option autocd ermöglicht einen Verzeichniswechsel ohne die Eingabe eines vorangestellten cd auf der Kommandozeile. Ohne diese Option führt die Eingabe zu Statusmeldung bash: /tmp/: ist ein Verzeichnis., ohne dass etwas passiert. Mit aktivierter Option zeigt die Bash den Befehl cd /tmp/ an und wechselt in das angegebene Verzeichnis. In diesem Zusammenhang lohnt es sich, die Option dirspell zu erwähnen: Ist sie aktiviert, versucht die Shell Schreibfehler in Verzeichnisnamen automatisch zu korrigieren.

Die Option checkjobs hat mit Version 4.0 Einzug in die Bash gehalten. Sobald Sie sie gesetzt haben, prüft die Shell vor dem Beenden, ob es noch aktive oder angehaltene Hintergrundprozesse gibt. Das beugt einem unbeabsichtigtes Beenden solcher Tasks vor.

Für Shell-Programmierer bedeutsam sind drei neue Optionen, die dafür sorgen, dass sich die aktuelle Version der Bash kompatibel zu Vorversionen verhält: compat31 macht die Bash kompatibel zur Version 3.1, compat32 zur Version 3.2 und compat40 regelt entsprechend das Verhalten der Bash 4.1 in Bezug auf die Version 4.0. Die tatsächlichen Auswirkungen dieser Einstellungen fallen in den meisten Fällen gering aus. Die Datei CHANGES und die aktuelle Manpage beziehungsweise FAQ listen Genaueres dazu auf.

Builtins und reservierte Wörter

Wie bei jeder neuen Version erhält die Bash eine Reihe neuer eingebauter Befehle ("builtins") und ergänzt die Optionen der vorhandenen. Zu den wichtigsten eingebauten Befehlen gehört mapfile, der auf das Synonym readarray hört: Er liest voreingestellt Zeilen von der Standardeingabe oder einem anderen Kanal in ein Array ein (Vorgabe: MAPFILE).

So liest das Kommando aus Listing 1 elf Zeilen (-n 11), beginnend in Zeile 2 (-s 1, das erste Element liegt auf Position 0) aus der angegebenen Datei ein. Alle zwei Zeilen (-c 2) gibt der Befehl die Anzahl eingelesener Datensätze an (-C echo). Es handelt sich bei dem Builtin nicht um ein wirklich neues Feature, alles ließe sich mithilfe von Schleifen nachprogrammieren. Es erleichtert aber die Arbeit.

Listing 1

mapfile -n 11 -s 1 -c 2 -C echo < /etc/passwd
1
3
[…]
9

Auch den klassischen Read-Befehl zum Einlesen haben die Entwickler überarbeitet: Die neue Option -i erlaubt es, beim Einsatz der Readline-Bibliothek (-e) Vorgaben für den Reply-Buffer anzugeben (Listing 2).

Listing 2

$ read -t2 -ei readline
readline
$ echo $REPLY
readline

Readline löscht die Vorgaben nicht automatisch, sondern ergänzt sie um eigene Angaben. Um also statt readline die Zeichenkette nixda in die Variable REPLY zu übergeben, müssen Sie die Eingabezeile im obigen Beispiel zunächst mit [Strg]+[U] komplett löschen.

Die Befehle printf und echo -e geben nun die Steuerzeichen \" (maskierte Hochkommata) und \? (maskiertes Fragezeichen) problemlos aus. Bei printf ermöglicht -v die Ausgabe in eine Array-Variable.

Der Multifunktionsbefehl declare definiert Variablen und Funktionen. Mit der neuen Option -p gibt der Befehl alle momentan gesetzten Variablen mit ihren Werten aus (Listing 3). Das neue Format eignet sich als Eingabe, beispielsweise in Skripten. Mit der Option -f gibt declare Funktionen aus (Listing 4). Auch hier eignet sich die Ausgabe – oben der Funktionsname, zwischen den geschweiften Klammern der Code – wieder als Eingabe.

Listing 3

$ declare -p
declare – BASH="/usr/local/bin/bash41"
[…]
declare -r bash3="4.1.0(1)-release"

Listing 4

$ declare -f
command_not_found_handle ()
{
  if [ -x /usr/lib/command-not-found ]; then
    /usr/bin/python /usr/lib/command-not-found – $1;
    return $?;
  else
    return 127;
  fi
}

Die weiteren neuen Optionen von declare bewirken ein Umwandeln der Buchstaben eines Strings in Klein- (-l) oder Großbuchstaben (-u) beziehungsweise eine Umwandlung nur des ersten Buchstabens des Strings (-c) in einen Großbuchstaben (Listing 5).

Listing 5

$ declare -l kg=TZ ; echo $kg
tz
$ declare -u kg=tz ; echo $kg
TZ
$ declare -c kg=tz ; echo $kg
Tz

Das Case-Statement erhielt durch neue Begrenzerzeichen zwei zusätzliche Varianten: ;& bewirkt, dass case auch die folgende Zeile auswertet – normalerweise beendet die Bash die Verzweigung sofort nach einem Treffer. Listing 6 zeigt ein Beispiel: Hier gibt tst z wie erwartet 1z aus, aber tst t erzeugt 1t 1z als Ausgabe. Mit ;;& gehen Sie noch einen Schritt weiter: Dann wertet die Bash alle folgenden Tests aus.

Listing 6

[…]
tst ()
{
  case $1 in
    t) echo "1t" ;&
    z) echo "1z" ;;
  esac
}
[…]

Die Befehle zur Jobkontrolle (jobs, kill und wait) verarbeiten mit %Jobnummer nun eine weit verbreitete Schreibweise für diesen Parameter. Ein neues Schlüsselwort coproc erzeugt einen Co-Prozess, ähnlich einem durch & gestarteten Hintergrundprozess. Allerdings bleiben Co-Prozesse im Unterschied zu den normalen Jobs mit dem startenden Terminal verbunden, können also bei Ein- und Ausgaben damit kommunizieren. Die Syntax ist einfach:

coproc: coproc Name command Redirections

Eine Besonderheit liegt darin, dass Sie Co-Prozessen einen Namen geben dürfen. Voreingestellt ist dafür COPROC". Unter examples/functions/ finden Sie die Datei coproc.bash mit Beispielen zum Einsatz der neuen Funktion.

Verbundene Befehle kennt die Bash in mehreren Formen: Zwischen einfachen runden Klammern stehen so genannte Listen, die die Bash in einer Subshell ausführt. Zwischen einfachen geschweiften Klammern stehende Listen führt die Bash in der aktuellen Shell aus. Setzen Sie doppelte runde oder gar (doppelte) eckige Klammern, interpretiert die Shell den Inhalt als Ausdruck. In einem solchen expandiert die Shell keine Wörter oder Dateinamen, was eine Besonderheit in der Befehlszeile ist.

In Ausdrücken innerhalb von doppelten runden oder doppelten eckigen Klammern bestimmen die durch Operatoren definierten Vergleiche den Rückgabewert des Ausdrucks. Dabei vergleicht die Bash die linke Seite vor dem Operator mit der rechten. Doppelte runde Klammern kommen bei numerischen Vergleichen zum Einsatz, die doppelten eckigen für alle anderen. In der numerischen Variante erzeugen Ergebnisse im Ausdruck ungleich Null einen Rückgabewert von Null:

$ (( 3/5 )) ; echo $?
1

Das Kommando echo $? gibt dabei den Rückgabewert der zuletzt ausgeführten Befehlszeile aus. Zwischen eckigen Klammern stehende Ausdrücke kommen oft in Kontrollstrukturen zum Einsatz. Hier entscheidet der Rückgabewert, wie die Bash weiter verfährt. Das Konstrukt wirkt wie der eingebaute Test-Befehl und unterstützt dessen Optionen. Über den Operator =~ werten Sie erweiterte reguläre Ausdrücke im Stile von Egrep aus. Das geht immer über die (neue) Variable $BASH_REMATCH:

[[ "$line" =~ "abc(.*)xyz" ]] &&
echo "${BASH_REMATCH[0]}"

Die Variable $line enthält die zu testenden Zeilen, zum Beispiel eingelesen in einer Read-Schleife. Die Mustersuche filtert nach Zeichenketten, die mit abc beginnen und auf xyz enden. Findet die Bash eine solche, ist der Ausdruck innerhalb der Klammern wahr und die Shell gibt das Element des Arrays aus, das den Treffer enthält.

Der eingebaute Help-Befehl hat nun zwei neue Optionen: Mit -d zeigt er eine Kurzinformation ähnlich apropos an, mit -m gibt die Bash die vorhandenen Informationen in Form einer Manpage aus. Das funktioniert nicht nur für die Builtins, sondern auch für Variablen und Schlüsselwörter (Listing 7).

Listing 7

$ help -m '{'
NAME
     { … } - Group commands as a unit.
SYNOPSIS
     { COMMANDS ; }
DESCRIPTION
     Group commands as a unit.
[…]

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • Bash-Kurs Teil 6
    Die elementaren Konfigurationsmöglichkeiten mit eingebauten Funktionen der Bash sind der Schwerpunkt dieses Teils. Im nächsten wird ein komfortables Tool zur Erzeugung von Konfigurationsdateien vorgestellt.
  • Version 4.0 der Bash mit assoziativen Arrays
    Die Bourne Again Shell (Bash) des GNU-Projekts ist in ihrer vierten Major-Version erschienen. Der Versionssprung beschert den Anwendern zahlreiche Neuerungen.
  • Bash-Konfiguration, die zweite
    In diesem zweiten Teil der Serie über die Konfiguration der Bash wird es noch einmal praktisch: Das Einstellen des Prompts, und die für die Fehlersuche so nützlichen Tracing-Modi werden beschrieben.
  • Tricks für die Bash
    Mit ein paar grundlegenden Kniffen bringen Sie Schwung und Farbe in die Arbeit auf der Kommandozeile.
  • Bequem eingerichtet
    Mit Umgebungsvariablen richten Sie sich die Kommandozeile individuell und gemütlich ein.
Kommentare

Infos zur Publikation

LU 11/2014: VIDEOS BEARBEITEN

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Artikelsuche
Erwin Ruitenberg, 09.10.2014 07:51, 1 Antworten
Ich habe seit einige Jahre ein Dugisub LinuxUser. Dann weiß ich das irgendwann ein bestimmtes Art...
Windows 8 startet nur mit externer Festplatte
Anne La, 10.09.2014 17:25, 4 Antworten
Hallo Leute, also, ich bin auf folgendes Problem gestoßen: Ich habe Ubuntu 14.04 auf meiner...
Videoüberwachung mit Zoneminder
Heinz Becker, 10.08.2014 17:57, 0 Antworten
Hallo, ich habe den ZONEMINDER erfolgreich installiert. Das Bild erscheint jedoch nicht,...
internes Wlan und USB-Wlan-Srick
Gerhard Blobner, 04.08.2014 15:20, 2 Antworten
Hallo Linux-Forum: ich bin ein neuer Linux-User (ca. 25 Jahre Windows) und bin von WIN 8 auf Mint...
Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 1 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...