Zurück

dialog und Xdialog: grafische Dialoge in Shellscripts

Sie meinen Shellscripts und grafische Dialoge seien 2 gegensätzliche Welten? Mitnichten! Mit den beiden Befehlen dialog und Xdialog können Sie auch grafische Dialoge in Ihre Shellscripts einbauen.

Wenn Sie ein Shellscript schreiben, das mit seinem Benutzer in Interaktion treten soll und der Benutzer auch noch ein unbedarfter PC-User ist, haben wir das beste Beispiel für das Einsatzgebiet der beiden Befehle dialog und Xdialog. Was ist der Unterschied zwischen den beiden Befehlen?

Xdialog stellt echte grafische Dialogfenster zur Verfügung, die mit der Maus benutzt werden können. Dies erfordert natürlich einen laufenden X-Server. Xdialog ist damit die beste Wahl für Scripts im Desktopumfeld, die vor allem von Normalusern benutzt werden sollen. Xdialog beruht auf dem GTK-Toolkit.

Im Gegensatz dazu läuft dialog ausschließlich in der Textkonsole. dialog stellt eine Art pseudografische Oberfläche (nccurses) zur Verfügung und kann nicht mit der Maus, sondern nur mit der Tastatur bedient werden. Dadurch ist dialog flexibler als Xdialog, da es auch ohne X-Server läuft und sehr gut auch in der Fernwartung über SSH eingesetzt werden kann. Dafür ist dialog nicht ganz so benutzerfreundlich.

dialog liegt den meisten Distributionen bei, häufig wird es sogar in der Standardinstallation mit installiert. Xdialog ist hingegen in vielen Distributionen nicht enthalten. Man kann es über die Homepage von Xdialog, sowohl als RPM- oder Debianpaket, als auch im Quelltext herunterladen: http://xdialog.dyns.net.

Wie muß ich nun dialog in meine Shellscripts einbauen? Ich schreibe hier für dialog, aber das Gesagte kann in den meisten Fällen 1 zu 1 auch in Xdialog übernommen werden.

Die allgemeine Syntax des Befehls ist:

dialog [optionen] [Art des Feldes] "Text" [breite] [höhe]

An Arten des Feldes gibt es beispielsweise, Messageboxen, Ja-Nein-Abfragen, Dateiauswahl, Inputboxen und sogar Kalender. Probieren wir einfach mal einen einzelnen Befehl aus:

rene@thor:~> dialog --msgbox "Hallo" 0 0

Das Ergebnis ist eine Messagebox mit dem Text "Hallo" und einem OK-Button. Der Befehl wartet so lange bis der OK-Button gedrückt wurde (durch Return). Da wir nur einen Befehl abgeschickt haben, landen wir danach wieder in unserer Shell. Das "Bild" der Messagebox wurde allerdings nicht ganz entfernt. Daher sollte man am Ende eines Scripts, stets dafür sorgen, das der Bildschirminhalt geleert wird (z. B. durch clear). Für Breite und Höhe haben wir in diesem Fall 0 verwendet. Durch 0 wird die Dialogbox einfach so angepaßt, daß Ihr Inhalt optimal darin Platz hat.

Die oben benutzte einfache Messagebox, läßt jedoch noch keine echte Interaktion aufkommen. Anders sieht es schon bei einer Ja/Nein Box aus:

dialog --yesno "Finden Sie Dialog gut?" 0 0

Doch wie nehme ich nun die Antwort in meinem Script entgegen? Schreiben wir ein kleines Script zur Veranschaulichung:

#!/bin/bash

dialog --yesno "Finden Sie Dialog gut?" 0 0

dialog --msgbox "Ihre Antwort war: $?" 0 0

clear

exit 0


Machen Sie das Script mit chmod ausführbar und starten es. Sie werden feststellen, daß wenn Sie mit Ja antworten, die Variable $? automatisch den Wert 0 bekommt, während wenn Sie mit Nein antworten die Variable $? den Wert 1 annimmt. Was ist die Variable "$?"?

In der Umgebungsvariable $? steht immer der Exitstatus des letzten ausgeführten Befehls. Der Exitstatus eines Befehls ist 0, wenn er ohne Fehler beendet wurde und ungleich 0 wenn ein Fehler aufgetreten ist. dialog verwendet einfach die Antwort als Exitstatus, also Ja für 0 und Nein für 1. Sie können daher unmittelbar nach Beendigung des Befehls, $? auswerten. Sollte allerdings noch vor der Auswertung ein weiterer Befehl stehen, würde sich $? auf diesen Befehl beziehen. Die Auswertung muß daher unmittelbar dahinter erfolgen. Was aber wenn es nicht nur um ein einfaches Ja/Nein geht, sondern um eine vollständige Zeichenkette?

Versuchen wir uns an einem neuen Script:

#!/bin/bash

dialog --inputbox "Wie heißen Sie?" 0 0 2> tmp.dialog

clear

cat tmp.dialog

echo ""

exit 0


In eine Inputbox kann beliebiger Text hinein geschrieben werden. Dieser wird einfach auf die Standardfehlerausgabe geschrieben. Normalerweise landet die Standardfehlerausgabe einfach auf dem Bildschirm. In diesem Fall haben wir sie durch 2>, in die Datei tmp.dialog geschrieben. Den Inhalt dieser Datei können wir beliebig weiterverwenden. In diesem Fall geben wir Ihn einfach mit cat aus.

Darüberhinaus gibt es noch Optionen die dialog noch ein wenig aufpeppen können. Sie können beispielsweise einen Titel für die Dialogboxen einblenden:

dialog --title "Titel" --msgbox "Box mit Titel" 0 0

Mit der Option --backtitle kann auch noch ein Hintergrundtitel eingeblendet werden:

dialog --title "Titel" --backtitle "Titel" --msgbox "Box mit Titel" 0 0

Für eine komplette Übersicht aller Optionen können Sie die Manpage von dialog aufrufen. Eine Liste mit allen Boxtypen bekommen Sie mit dialog --help, bzw. Xdialog --help.

Viel Spaß beim grafischen Programmieren.

Zurück

Zurück nach oben
Shell mit Kommandoprompt