Qual der Wahl

Die Zeilen 2 bis 15 legen das zu verwendende Frontend fest: gdialog bei Gnome, kdialog unter KDE oder das textbasierte dialog. Deutlich lässt sich in Zeile 7 die Sonderbehandlung von Kdialog erkennen: Hier wird die Standardausgabe in die Datei termine.in umgeleitet, während es bei Dialog und Gdialog die Standard-Fehlerausgabe ist:

dialog … 2>~/.termine.in
kdialog … 1>~/.termine.in
gdialog … 2>~/.termine.in

Leider akzeptiert die Bash keine Variable an Stelle der Umleitung, weshalb das folgende, kompaktere Listing nicht funktioniert:

#! /bin/bash
Redirect="1>~/.termine.in"
echo "Test" $Ausgabe

Einzig die eval-Anweisung ermöglicht, die Umleitung flexibel zu gestalten:

#! /bin/bash
Redirect="1>~/.termine.in"
eval echo "Test" $Ausgabe

Deshalb wird in den Zeilen 2 bis 11 zunächst bestimmt, welches der Programme installiert ist. Dementsprechend speichert das Sktipt den Programmnamen und die passende Umleitung in Variablen.

Weiterhin unterscheidet sich der Funktionsumfang der einzelnen Dialog-Varianten. Im Kasten "Portable Dialog-Funktionen" finden Sie eine Auswahl der Funktionen, die nach Erfahrung des Autors nahezu alle Dialog-Varianten auch in etwas älteren Versionen unterstützen. Damit sind Sie auf der sicheren Seite, wenn es darum geht, das Skript auch auf anderen Systemen einzusetzen. Würden Sie Funktionen verwenden, die etwa Kdialog in der auf Ihrem System installierten Version nicht versteht, bekämen Sie lediglich eine Fehlermeldung auf der (in dem Fall verborgenen) Kommandozeile zu sehen. Ihr Programm würde derweil möglicherweise in einer Endlosschleife festhängen, weil keine Eingabe erfolgt.

Das Listing 1 teilt sich in acht logische Blöcke: Die Anfangs-Definitionen (Zeile 2), fünf Funktionen (Zeile 20 bis 132), das Einlesen der Terminliste (Zeile 136) und das Hauptmenü (Zeile 159).

Abbildung 1: Ein Programm, drei Frontends: dialog (oben), gdialog (links unten) und kdialog (rechts unten) werden fast identisch angesteuert, unterscheiden sich aber in Aussehen und Bedienung.

Komplexe Menüs einfach verpackt

Die Funktion AuswahlMenue (Zeile 20 bis 59) präsentiert, wie der Name schon sagt, ein Auswahl-Menü. Der erste Parameter dieser Funktion gibt der Titel des Menüs an, im zweiten lagern die Tastenkürzel als Tabulator-getrennte Liste. Im dritten Parameter finden sich die Beschreibungen der einzelnen Menüpunkte, wiederum durch Tabulatoren getrennt. Die Tastenkürzel aus dem zweiten Parameter nutzt Dialog zudem als Rückgabewert, wenn ein Menüpunkt ausgewählt wurde.

In den Zeilen 26 bis 34 und 33 bis 43 trennt die Funktion die beiden Tabulator-separierten Listen mit Hilfe der IFS-Variablen und dem Befehl set in zwei Arrays auf. Bei der Gelegenheit bestimmt sie in Zeile 34 gleich die Anzahl der Auswahlpunkte des Menüs. Dieser Aufwand ist deshalb erforderlich, weil Dialog Menüs in folgender Schreibweise erwartet:

dialog --menu Titel Menühöhe in Zeilen MenübreiteInZeichen AnzahlMenüeinträge Tastenkürzel Menüpunkt Tastenkürzel Menüpunkt

In den Zeilen 45 bis 48 baut die Funktion AuswahlMenue das Menü in der von Dialog benötigten Reihenfolge wieder zusammen und speichert das Ergebnis, jeweils mit Tabulator getrennt, in der Variablen Menu. Die Trennung mit Tabulatoren ist deswegen bemerkenswert und wichtig, weil die Menüpunkte selbst natürlich Leerzeichen enthalten können. Ohne Veränderung der Variablen ISF in Zeile 26 könnte Dialog später nicht zwischen einem Leerzeichen innerhalb zwei Worten eines Menüpunkts und der Trennung eines Tastenkürzels vom Text unterscheiden.

Die Variable Overhead in Zeile 50 ist nur für dialog nötig. Einer der Parameter gibt die Größe des Menü-Rahmens an. Dort müssen Dinge wie Überschrift, innere Rahmen und OK- sowie Abbruch-Schaltfläche berücksichtigt sein. Den Wert ermitteln Sie einfach durch Ausprobieren.

In Zeile 56 baut das Skript den Parameter-String für den Dialog-Aufruf zusammen. Dies sorgt dafür, dass jedes Menü in einheitlichem Design erscheint und zum Beispiel der Titel des Menüs stets mit eingebaut wird.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Teil 7: Benutzerfreundliche Ein-/Ausgabe
    Im letzten Teil des Bash-Programmierkurses geht es um die benutzerfreundliche Gestaltung von Eingaben und Dialogen am Beispiel der Programme dialog, gdialog und kdialog.
  • Shell-Skripte mit grafischen Dialogen
    Dass sich Shell-Programmierung und grafische Oberflächen nicht ausschließen, zeigt KDialog: Nie war es leichter, Shell-Skripte um User-Interaktion zu ergänzen.
  • Textbasierte User-Interfaces (Teil 1)
    Die Kommandozeile halten viele Anwender für trist und schlecht bedienbar. Das muss aber nicht so sein: Mithilfe von Dialog und Whiptail werten Sie Ihre eigenen Skripts unkompliziert mit Fenstern, Menüs und Dialogen auf.
  • Klacker, Klacker, Klick, Klick
    Häufig erledigen Skripte ihre Aufgaben unsichtbar im Hintergrund. Mancher User wünscht sich aber ein visuelles Feedback. Dank Zenity und KDialog fügen sich Ihre Skripte nativ in die KDE- oder Gnome-Umgebung ein.
  • Mehr Komfort
    Von einfachen Abfragen bis hin zu komplexen Menüs: Mit dem Toolkit Dialog bauen Sie eine grafische Oberfläche für Shell-Skripte, die oft nicht mehr als eine zusätzliche Zeile brauchen.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

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

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

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

Stellenmarkt

Aktuelle Fragen

Huawei
Pit Hampelmann, 13.12.2017 11:35, 2 Antworten
Welches Smartphone ist für euch momentan das beste? Sehe ja die Huawei gerade ganz weit vorne. Bi...
Fernstudium Informatik
Joe Cole, 12.12.2017 10:36, 2 Antworten
Hallo! habe früher als ich 13 Jahre angefangen mit HTML und später Java zu programmieren. Weit...
Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 3 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...