Portabel programmieren mit Dialog, Gdialog und Kdialog

Aus LinuxUser 02/2005

Portabel programmieren mit Dialog, Gdialog und Kdialog

Dialogregie

Bash-Skripte sind meist nur für die Verwendung auf der Kommandozeile gedacht und schrecken Nicht-Experten mit unübersichtlichen Ausgaben ab. Das muss aber nicht so sein: Die Programme Dialog, Gdialog und Kdialog verstecken die Kommandozeile vollständig vor dem Benutzer.

Bash-Skripte erledigen in der Regel nur Kleinigkeiten. Administratoren und Programmierer benutzen die Bash praktisch ausschließllich, um alltägliche Standardaufgaben zu automatisieren, für die es sich nicht lohnt, ein ausgewachsenes Binärprogramm in einer Hochsprache zu schreiben.

Ein großes Manko fast aller Skripte stellen das rudimentäre Benutzer-Interface und die meist schlechte Benutzerführung dar. Der von KDE und Gnome verwöhnte Anwender findet es umständlich, erst eine Textkonsole zu öffnen und dann knappe Fragen mit Tastatureingaben zu beantworten. Die Kommandozeile schreckt insbesondere Einsteiger ab, die mit den Linux-Befehlen noch nicht vertraut sind.

Standardisierte Menüs

Das Programmdialog ermöglicht die Darstellung eines ansprechenderen Benutzer-Interfaces. Dialog war anfangs nur für die Kommandozeile gedacht und baute aus farbigen Hintergründen und einigen ASCII-Zeichen Rahmen und Menüs. Mit der zunehmenden Verbreitung von KDE und Gnome hat auch Dialog nachgezogen und verfügt mittlerweile über Ableger gebildet: kdialog für KDE und gdialog für Gnome.

Dialog und seine grafischen Pendants werden komplett über die Kommandozeile gesteuert. Genügen bei einfachen Abfragen noch eine Hand voll Parameter, gestalten sich große Auswahllisten oder Menüs schnell unübersichtlich. Dialog baut dann selbständig anhand der Kommandozeilen-Parameter die Bedienoberfläche auf und übernimmt die komplette Interaktion mit dem Benutzer.

Bei Menüs oder Abfragen liefert Dialog die Auswahl des Anwenders an das aufrufende Programm oder Skript zurück. Beim Ur-Dialog für die Kommandozeile muss dies über den Rückgabewert von Dialog oder die Standard-Fehlerausgabe (stderr) laufen. Die Standardausgabe (stdout) benötigt Dialog für die Interaktion mit dem Benutzer.

Grafische Oberfläche gefällig?

Bei den grafischen Varianten Gdialog und Kdialog wäre dies prinzipiell nicht erforderlich: Sie könnten die Auswahlen per Standard-Ausgabe zurück geben. Aus Kompatibilitätsgründen zu Dialog verwendet Gdialog jedoch weiterhin die Standard-Fehlerausgabe. Leider verwendet Kdialog statt dessen die Standardausgabe, was eine portable Programmierung erschwert.

Als Beispiel soll der Termin-Client eines Terminüberwachungs-Skripts dienen, das bereits im siebten Teil der Programming Corner aus LinuxUser 02/2002 [1] vorgestellt wurde. Der Client kommuniziert über Dialog, Gdialog oder Kdialog mit dem Benutzer. Währenddessen läuft der Server still im Hintergrund. Listing 1 enthält den um einige Kommentare verkürzten Quellcode des Termin-Clients.

Listing 1

Der Termin-Client

001  #!/bin/bash
002  if [ -n "`which gdialog 2>/dev/null`" ]; then
003    Dialog="`which gdialog`"
004    DialogRedirect="2>~/.termine.in"
005  elif [ -n "`which kdialog 2>/dev/null`" ]; then
006    Dialog="`which kdialog`"
007    DialogRedirect="1>~/.termine.in"
008  elif [ -n "`which dialog 2>/dev/null`" ]; then
009    Dialog="`which dialog`"
010    DialogRedirect="2>~/.termine.in"
011  else
012    echo "Sie benötigen dialog, kdialog oder gdialog,"
013    echo "um dieses Programm benutzen zu können."
014    exit 1
015  fi
016
017  COLUMNS=80
018  LINES=24
019
020  AuswahlMenue ()
021  {
022    Titel="\"$1\""
023    Tasten="$2"
024    Namen="$3"
025
026    IFS=$'\t'
027    set – $Tasten
028    i=1
029    while [ "$#" -gt "0" ]; do
030      Taste[$i]="\"$1\""
031      shift
032      i=$[$i+1]
033    done
034    Elemente="$i"
035
036    IFS=$'\t'
037    set – $Namen
038    i=1
039    while [ "$#" -gt "0" ]; do
040      Name[$i]="\"$1\""
041      shift
042      i=$[$i+1]
043    done
044
045    Menu=""
046    for ((i=1; $i<$Elemente; i=$[$i+1])); do
047      Menu="${Menu}${Taste[$i]}${IFS}${Name[$i]}${IFS}"
048    done
049
050    Overhead="7"
051    if [ "$[$Elemente+$Overhead]" -lt "$LINES" ]; then
052      DisplayLines="$[$Elemente+$Overhead]"
053    else
054      DisplayLines="$LINES"
055    fi
056    DialogParms="--menu $Titel $DisplayLines $[$COLUMNS-8] $[$Elemente-1] $Menu"
057    eval $Dialog $DialogParms $DialogRedirect
058    read < ~/.termine.in
059  }
060  TextEingabe ()
061  {
062    DialogParms="--inputbox \"$1\" 8 $[$COLUMNS-8] \"$2\""
063    eval $Dialog $DialogParms $DialogRedirect
064    read < ~/.termine.in
065    if [ "$REPLY" = "" ]; then
066      REPLY="$2"
067    fi
068  }
069  JaNein ()
070  {
071    DialogParms="--yesno \"$1\" 5 $[$COLUMNS-8]"
072    eval $Dialog $DialogParms $DialogRedirect
073  }
074  Fehler ()
075  {
076    DialogParms="--msgbox \"$1\" 5 $[$COLUMNS-8]"
077    eval $Dialog $DialogParms $DialogRedirect
078  }
079  TerminBearbeiten ()
080  {
081    Nr="$1"
082
083    while true; do
084      Keys="d${IFS}v${IFS}b${IFS}t${IFS}c${IFS}l${IFS}z${IFS}"
085      Menu="Datum: `date -d ${Datum[$Nr]} +%d.%m.%Y`${IFS}Vorwarnung: ${Vorwarnzeit[$Nr]} Tage${IFS}Betreff: ${Bezeichnung[$Nr]}${IFS}Text: ${Text[$Nr]}${IFS}CCs: ${CCs[$Nr]}${IFS}Löschen${IFS}Zurück"
086
087      AuswahlMenue "Termin bearbeiten:" "$Keys" "$Menu"
088      Auswahl="$REPLY"
089
090      case $Auswahl in
091        z|"")
092          break
093          ;;
094        l)
095          JaNein "Termin löschen: Sind Sie sicher?"
096
097          if [ "$?" = "0" ]; then
098            Termine=$[$Termine-1]
099
100            for ((i=$Nr; $i < $Termine; i=$[$i+1])); do
101              Datum[$i]=${Datum[$[$i+1]]}
102              Vorwarnzeit[$i]=${Vorwarnzeit[$[$i+1]]}
103              Bezeichnung[$i]=${Bezeichnung[$[$i+1]]}
104              Text[$i]=${Text[$[$i+1]]}
105              CCs[$i]=${CCs[$[$i+1]]}
106            done
107          fi
108          break
109          ;;
110        d)
111          TextEingabe "Datum, in der Form yyyy-mm-dd:" "`date -d ${Datum[$Nr]} +%Y-%m-%d`"
112          Datum[$Nr]="`date -d $REPLY +%Y%m%d`"
113          ;;
114        v)
115          TextEingabe "Vorwarnzeit in Tagen:" "${Vorwarnzeit[$Nr]}"
116          Vorwarnzeit[$Nr]="$REPLY"
117          ;;
118        b)
119          TextEingabe "Kurze Bezeichnung des Termins:" "${Bezeichnung[$Nr]}"
120          Bezeichnung[$Nr]="$REPLY"
121          ;;
122        t)
123          TextEingabe "Ausführliche Beschreibung, Anmerkungen:" "${Text[$Nr]}"
124          Text[$Nr]="$REPLY"
125          ;;
126        c)
127          TextEingabe "Zusätzliche Empfänger der Warnung (Komma-Trennung):" "${CCs[$Nr]}"
128          CCs[$Nr]="$REPLY"
129          ;;
130      esac
131    done
132  }
133
134  ##### Hauptprogramm #####
135
136  if [ -r ~/.termine ]; then
137    IFS=$'\r'
138    read -a TerminListe << EOF
139  `grep -v "^#" ~/.termine | tr "\n" "$IFS"`
140  EOF
141
142    IFS=$'\t'
143    i=1
144    while [ "${TerminListe[$i]}" != "" ]; do
145      set – ${TerminListe[$i]}
146      Datum[$i]=$1
147      Vorwarnzeit[$i]=$2
148      Bezeichnung[$i]=$3
149      Text[$i]=$4
150      CCs[$i]=$5
151      i=$[$i+1]
152    done
153    Termine="$i"
154  else
155    MailAdresse="${LOGNAME}@localhost"
156    Termine=1
157  fi
158
159  while true; do
160    IFS=$'\t'
161    Keys="0${IFS}\$Keys${IFS}n${IFS}q${IFS}x${IFS}"
162    Menu="Adresse:  ${MailAdresse}\$Menu${IFS}Neuer Termin${IFS}Speichern und Ende${IFS}Ende ohne Speichern"
163    for ((i=1; $i < $Termine; i=$[$i+1])); do
164      Keys="${Keys/\$Keys/${IFS}$i\$Keys}"
165      Menu="${Menu/\$Menu/${IFS}`date -d ${Datum[$i]} +%d.%m.%Y`: ${Bezeichnung[$i]}\$Menu}"
166    done
167    Keys="${Keys/\$Keys}"
168    Menu="${Menu/\$Menu}"
169
170    AuswahlMenue "Hauptmenü" "$Keys" "$Menu"
171    Auswahl="$REPLY"
172
173    case $Auswahl in
174      q)
175        if [ ! -e ~/.termine ]; then
176          touch ~/.termine 2>/dev/null
177        fi
178        if [ -w ~/.termine ]; then
179          echo "$MailAdresse" > ~/.termine
180          IFS=$'\t'
181          for ((i=1; $i < $Termine; i=$[$i+1])); do
182            cat >> ~/.termine << EOF
183  ${Datum[$i]}${IFS}${Vorwarnzeit[$i]}${IFS}${Bezeichnung[$i]}${IFS}${Text[$i]}${IFS}${CCs[$i]}
184  EOF
185          done
186          break
187        else
188          Fehler "Die Termine-Datei (~/.termine) lässt sich nicht schreiben."
189        fi
190        ;;
191      x|"")
192        exit 1
193        ;;
194      n)
195        Datum[$Termine]="`date +%Y%m%d`"
196        Vorwarnzeit[$Termine]="2"
197        Bezeichnung[$Termine]=""
198        Text[$Termine]=""
199        CCs[$Termine]=""
200        Termine=$[$Termine+1]
201        TerminBearbeiten $[$Termine-1]
202        ;;
203      0)
204        TextEingabe "Ihre Email-Adresse:" "$MailAdresse"
205        MailAdresse="$REPLY"
206        ;;
207      *)
208        TerminBearbeiten $Auswahl
209        ;;
210    esac
211  done

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: <code srcset=

dialog (oben), gdialog (links unten) und kdialog (rechts unten) werden fast identisch angesteuert, unterscheiden sich aber in Aussehen und Bedienung.” width=”252″ height=”300″ /> 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.

Benutzer-Eingaben per Fehlerausgabe

Die Antwort bei diesem Dialog-Aufruf bildet das Tastenkürzel (Buchstabe) des Menüpunkts, das der Benutzer ausgewählt hat. Dafür eignet sich der Rückgabewert (Exit Value) des Programms nicht, Dialog schreibt den Buchstaben auf die Standard-(Fehler-)Ausgabe. Deshalb ruft Zeile 57 die in den Zeilen 2 bis 10 gewählte Dialog-Variante schließlich mittels eval auf und leitet die Ausgabe, also die Auswahl des Benutzers, in die Datei ~/.termine.in um. Der read-Aufruf in Zeile 58 liest aus der Datei ~/.termine.in und speichert das Ergebnis in der Variablen REPLY.

Den Exit Value von Dialog berücksichtigt Zeile 57 nicht. Er lautet “0”, wenn der Benutzer eine Auswahl gemacht hat, oder “1”, wenn der Benutzer die Eingabe mit [Esc] oder Abbrechen verlässt.

Auch bei der Texteingabe mittels des Dialog-Parameters --inputbox in Zeile 62 und 63 reicht die Rückgabe eines Zahlenwerts via Exit Value nicht aus. Wie beim Menü schreibt Dialog die Eingabe des Benutzers auf die Standard-(Fehler-)Ausgabe. Bricht der Anwender die Eingabe ab, teilt Dialog das wie gehabt über den Exit Value mit.

Antwort als Exit Value

Anders laufen die Dinge bei einer einfachen Ja-Nein-Auswahl mit dem Parameter --yesno, wie in Zeile 71 und 72: Hier wird nur der Exit Value aus der Spezial-Variablen “$?” der Bash gelesen. “0” bedeutet an dieser Stelle “Ja”, “1” dagegen “Nein”.

Bei der Fehlerausgabefunktion in Zeile 74 bis 78 ist der Rückgabewert nicht von Belang. Dialog wird hier mit der Option --msgbox aufgerufen, was den dahinter stehenden Text in einem kleinen Fenster auf dem Bildschirm anzeigt. Der Benutzer hat nur die Möglichkeit, OK zu wählen.

Die Verwendung der Ausgabefunktionen von Zeile 20 bis 78 zeigt das Hauptprogramm ab Zeile 136. In den Zeile 161 und 162 sehen Sie das Hauptmenü des Termin-Clients: Tabulatoren trennen die Tastenkürzel in der Zeile 161; das gilt auch für die Beschreibungen der einzelnen Menüpunkte. Dies erlaubt, in den Beschreibungen Leerzeichen zu verwenden.

Menü-Aufbau im Hauptprogramm

Die Schleife von Zeile 163 bis 166 fügt dem Hauptmenü alle bereits vorhandenen Termine an, um sie bearbeiten zu können. Die Ausgabe über Dialog erfolgt schließlich in Zeile 170. Dazu rufen Sie einfach die Funktion auf und übergeben das Menü in zwei Variablen. Zeile 171 liest die Rückgabe des Aufrufs aus der Variablen REPLY, die von der Funktion AuswahlMenue gesetzt wurde.

Der Auswahlblock von Zeile 173 bis zum Ende des Programms behandelt die Eingabe des Benutzers, konkret das Tastenkürzel, das Dialog zurückgeliefert hat. Dialog interessiert sich nicht dafür, ob ein Tastenkürzel im Menü mehrfach vergeben wurde – bei der Auswertung der Rückgabe würde dies aber zu Chaos führen. Deshalb ist beim Aufbau des Hauptmenüs in Zeile 161 bis 166 besondere Umsicht geboten.

Will der Benutzer das Programm mit “q” verlassen, speichert der Termin-Client noch alle Termine und verlässt dann die Hauptschleife. Zeile 188 zeigt, wie Sie die Fehlerfunktion verwenden, falls das Speichern nicht geklappt hat.

Spitzfindigkeiten beim Datum

Das Tastenkürzel “0” ändert die eingestellte E-Mail-Adresse. Dazu benutzt das Programm die Funktion TextEingabe. Wie schon beim Menü übergeben Sie den anzuzeigenden Text sowie die Voreinstellung für die Eingabe einfach als Parameter der Funktion. Die Eingabe des Benutzers finden Sie in REPLY, wobei die Funktion wie oben beschrieben nicht berücksichtigt, dass der Benutzer die Eingabe auch abgebrochen haben könnte. In dem Fall ist die Variable REPLY leer.

Falls der Benutzer einen neuen Timer eingeben oder einen vorhandenen bearbeiten möchte, ruft das Hauptprogramm die Funktion TerminBearbeiten auf (Abbildung 2). Der Aufbau dieser Funktion ähnelt dem des Hauptmenüs.

Abbildung 2: Anpassen eines Termins: Mit <code srcset=

dialog lassen sich Einstellungen sehr übersichtlich ändern, die Menüführung nimmt vielen unerfahrenen Benutzern die Angst vor der Kommandozeile.” width=”262″ height=”300″ /> Abbildung 2: Anpassen eines Termins: Mit dialog lassen sich Einstellungen sehr übersichtlich ändern, die Menüführung nimmt vielen unerfahrenen Benutzern die Angst vor der Kommandozeile.

Eine Besonderheit versteckt sich in der Zeile 85: Die Terminliste speichert das Datum stets als achtstellige Zahl bestehend aus Jahr, Monat und Tag ohne Trennzeichen. Der Benutzer wünscht jedoch die Anzeige in der gewohnten Form Tag, Monat und Jahr getrennt durch Punkte. Der Befehl

date -d ${Datum[$Nr]} +%d.%m.%Y

wandelt deshalb am Anfang von Zeile 85 das kompakte Datum in die übliche deutsche Schreibweise um. Bei der Datumseingabe spielt uns jedoch date einen Streich: Das Kommando akzeptiert das Datum in der üblichen deutschen Schreibweise nicht, sondern nur in der englischen oder international gebräuchlichen. In der Zeile 111 erinnert der Termin-Client deshalb daran, dass an dieser Stelle nicht die übliche deutsche Schreibweise möglich ist.

Alles bunt!

Dialog beweist, dass selbst kleine Skripte eine ansprechende Benutzeroberfläche haben können und der Benutzer nicht genötigt werden muss, unübersichtliche Abfragen auf der Kommandozeile zu bedienen.

Die Kompatibilität von Gdialog und Kdialog zu Dialog erlaubt sogar, die Kommandozeile komplett vor dem Benutzer zu verbergen, sofern er mit einem grafischen System arbeitet. Der zusätzliche Programmieraufwand dafür hält sich in Grenzen, wie das Beispiel des Termin-Clients zeigt.

Als Lohn für die Mühe winkt meist eine größere Verbreitung des Skripts, wie der Autor selbst durch die Einführung des Dialog-basierten Installationssystem der Mini-Distribution LinVDR erlebt hat. Wenn die Kommandozeile nicht mehr zu Tage tritt, trauen sich auch viele Einsteiger den Umgang mit der Software zu.

Portable Dialog-Funktionen

Die folgenden Liste von Dialog-Funktionen basiert auf praktischen Erfahrungen des Autors und lässt sich über ein großes Versionsspektrum von dialog, gdialog und kdialog einsetzen.

Weitere Funktionen finden Sie in den jeweiligen Manual Pages der Programme. Bei älteren Versionen, wie sie zum Beispiel auf fremden Systemen noch im Einsatz sind, können diese Funktionen aber durchaus noch fehlen.

dialog --checklist Titel Anzeigehöhe Anzeigebreite Auswahlzeilen [ Kurztaste Beschreibung Status ]

Auswahlliste mit der Überschrift Titel. Das Fenster in der Größe Anzeigehöhe mal Anzeigebreite umfasst Auswahlzeilen Einträge. Jeder Eintrag besteht aus der Kurztaste Kurztaste sowie der zugehörigen Beschreibung Text und hat entweder den Status “on” oder “off”.

Beendet der Benutzer die Auswahl mit OK, endet Dialog mit dem Exit Value “0” und liefert die Kurztasten aller aktivierten Einträge, in Anführungszeichen eingeschlossen und mit Leerzeichen getrennt, über die Standard-(Fehler-)Ausgabe zurück. Bricht der Benutzer die Auswahl ab, liefert Dialog den Exit Value “1”; drückt er [Esc], gibt Dialog den Wert “255” zurück.

dialog --inputbox Text Anzeigehöhe Anzeigebreite [ Standardwert ]

Texteingabefeld der Größe Anzeigehöhe mal Anzeigebreite, in dem Text und eine Eingabezeile stehen. Wird Standardwert beim Aufruf übergeben, füllt Dialog die Eingabezeile entsprechend.

Die Länge der Eingabezeile ist theoretisch nicht begrenzt. Der Autor empfiehlt aber, keine Eingaben länger als 255 Zeichen abzufragen. Eine mehrzeile Eingabe lässt sich nicht realisieren.

Bestätigt der Benutzer die Eingabe mit OK, liefert Dialog den Inhalt der Eingabezeile per Standard-(Fehler)-Ausgabe zutück, der Exit Value lautet “0”. Bei Abbruch gibt Dialog als Exit Value “1” zurück; drückt der Benutzer [Esc], liefert es “255”.

dialog --menu Titel Anzeigehöhe Anzeigebreite Menüzeilen [ Kurztaste Menütext ]

Auswahlmenü, über dem Titel angezeigt wird. Das Fenster der Größe Anzeigehöhe mal Anzeigebreite umfasst Menüzeilen Menüeinträge. Jeder Menüeintrag besteht aus der Kurztaste Kurztaste und der zugehörigen Beschreibung des Menüpunkts, Menütext. Wird ein Menüpunkt ausgewählt, liefert Dialog die Kurztaste des betreffenden Menüpunkts über Standard-(Fehler-)Ausgabe zurück und endet mit dem Exit Value “0”. Bricht der Benutzer die Auswahl ab, liefert Dialog den Exit Value “1”; drückt er [Esc], gibt Dialog den Wert “255” zurück.

dialog --msgbox Meldung Anzeigehöhe Anzeigebreite

Benachrichtigungsfeld in der Größe Anzeigehöhe mal Anzeigebreite, in der die Meldung ausgegeben wird. Der Benutzer kann lediglich mit OK bestätigen. Dialog gibt dann den Exit Value “0” zurück. Drückt der Anwender [Esc], liefert es den Exit Value “255”.

dialog --radiolist Titel Anzeigehöhe Anzeigebreite Auswahlzeilen [ Kurztaste Beschreibung Status ]

Auswahlliste ähnlich --checkbox, über der Titel angezeigt wird. Das Fenster der Größe Anzeigehöhe mal Anzeigebreite umfasst Auswahlzeilen Einträge. Jeder Eintrag besteht aus der Kurztaste Kurztaste sowie der zugehörigen Beschreibung Text.

Im Unterschied zur --checkbox darf jedoch nur genau ein Eintrag den Status “on” haben. Alle anderen müssen den Status “off” haben, anderenfalls funktioniert die Auswahl nicht.

Der Benutzer kann nur genau einen Eintrag aktivieren. Beendet er die Auswahl mit OK, liefert Dialog die Kurztaste des aktivierten Eintrags über die Standard-(Fehler-)Ausgabe zurück und terminiert mit Exit Value “0”. Bricht der Benutzer die Auswahl ab, liefert Dialog den Exit Value “1”. Drückt er [Esc], beendet Dialog mit dem Rückgabewert “255”.

dialog --textbox Dateiname Anzeigehöhe Anzeigebreite

Dateibetrachter, der den Inhalt der Datei Dateiname in einem Fenster der Größe Anzeigehöhe mal Anzeigebreite anzeigt. Der Benutzer kann beliebig im Text blättern und den Betrachter mit Verlassen beenden, wobei Dialog den Exit Value “0” zurück liefert. Drückt der Benutzer [Esc], terminiert Dialog mit dem Exit Value 255.

dialog --yesno Meldung Anzeigehöhe Anzeigebreite

Ja/Nein-Abfrage in der Größe Anzeigehöhe mal Anzeigebreite, in der die Meldung ausgegeben wird. Im Gegensatz zum Benachrichtigungsfeld kann der Benutzer zwischen Ja (Exit Value “0”) und Nein (Exit Value “1”) wählen. Drückt er [Esc], lautet der Rückgabewert “255”.

Infos

[1] Mirko Dölle: “Komfortable Dialoge”, LinuxUser 02/2004, Seite 42; Online unter http://www.linux-user.de/ausgabe/2002/02/042-pcorner/pcorner7.html

LinuxUser 02/2005 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben