(X)dialog: Sprechende Shells
ArticleCategory: [Choose a category, translators: do not
translate this, see list below for available categories]
UNIXBasics
AuthorImage:[Here we need a little image from you]
TranslationInfo:[Author + translation history. mailto: or
http://homepage]
original in en Katja and Guido Socher
en to de Katja Socher
AboutTheAuthor:[A small biography about the author]
Katja ist die deutsche Editorin von LinuxFocus. Sie mag Tux,
Film & Fotografie und das Meer. Ihre Homepage befindet sich
hier.
Guido ist ein langj�hriger Linuxfan und er mag Linux, weil es von
ehrlichen und offenen Leuten entworfen wurde. Dies ist einer der Gr�nde,
warum wir es Open Source nennen. Seine Homepage befindet sich unter linuxfocus.org/~guido.
Abstract:[Here you write a little summary]
Xdialog und dialog sind zwei klassische Utilities, um deine Shellskripte mit
einer grafischen Bnutzerschnittstelle zu bereichern. Du brauchst ein wenig
Erfahrung in Shellprogrammierung, um den Artikel verstehen zu k�nnen. Um die
Grundlagen der Shellprogrammierung zu lernen, kannst du unseren Artikel �ber
Shell Programmierung lesen.
ArticleIllustration:[One image that will end up at the top
of the article]
ArticleBody:[The main part of the article]
Einf�hrung
Die UNIX Shell ist eine sehr produktive Umgebung f�r sich genommen und
arbeitet sehr gut ohne grafische Benutzerschnittstelle.
In ein paar F�llen macht es allerdings Sinn, einen grafischen Dialog mit der
Benutzerin zu haben. Ein Beispiel w�re z.B. der Installationsdialog eines
Programms. Man hat eine Reihe von Optionen f�r die zu installierenden
Features und man kann das Zielverzeichnis ausw�hlen....
Komm herein zu (X)dialog...
Mit dialog und Xdialog kann man eine grafische Applikation allein durch
Schreiben eines kurzen Shellscripts entwerfen. Dialog ist ein rein terminal-basiertes Programm und
Xdialog ist ein X11 Programm.
Hier ist ein Beispiel:
Du kannst die folgenden Zeilen in ein Shellfenster (xterm, konsole,....)
tippen (oder kopieren/pasten):
bash
Xdialog --yesno "Do you want to learn more about Xdialog?" 0 0;\
case $? in
0)
echo "Result: Yes chosen.";;
1)
echo "Result: No chosen.";;
255)
echo "ESC pressed.";;
esac
Die Box, die erscheint, sieht so aus:
Wenn du dialog anstelle von Xdialog benutzt (entferne das X in der zweiten
Zeile im oben gezeigten Skript), dann bekommst du eine auf curses
basierende Applikation, die innerhalb von xterm l�uft und kein separates
Fenster �ffnet. In einigen F�llen ist das eher f�r ein Shellscript
angebracht, da es nur innerhalb des Terminalfensters l�uft. Besonders, wenn
du es remote mit einer Anzahl verschiedener hosts zwischen deinem Computer
und dem entfernten host laufen
lassen willst und kein direktes IP Routing verf�gbar ist. In diesem Fall l�uft dialog, aber du bist nicht in der Lage,
eine X11 Applikation wie Xdialog zu starten.
Das obige war ein ziemlich nutzloses Beispiel von dialog/Xdialog, aber es zeigt, wie einfach es ist, einen einfachen graphischen Dialog zu programmieren. Es gibt weitere interessante Dialogboxen. Boxen wie calendar (Kalendar), menus (Men�s),
filemanager, progess bar, text input, message box, password dialog, ...
La�
dialog --help
oder
Xdialog --help
laufen, um eine Liste der vorhandenen Dialogboxen zu bekommen. Xdialog hat ein paar mehr Boxen als dialog.
Wie es arbeitet
Die Dialogk�sten werden auf der Kommandozeile konfiguriert.
dialog --yesno "text string" <height>
<width>
Nach dem Tippen von dialog oder Xdialog mu� man den Namen der gew�nschten Box angeben, gefolgt von ihren spezifischen Parametern.
Die yesno
Box verlangt 3 Parameter.
<height> und <width> k�nnen auf 0 gesetzt werden, wodurch die Geometrie der Box sich automatisch nach der L�nge des Textes richtet. Das Ergebnis wird als exit status an das Skript in der Variablen "$?" zur�ckgegeben. Wenn mehr zur�ckgegeben werden mu�, wie z.B. die Namen von selektierten Optionen, dann wird dies auf Standarderror zur�ckgegeben. Standarderror wird normalerweise einfach auf den Bildschirm geschrieben, kann aber mit ">2" umgeleitet werden.
Eine sehr einfache, aber wirkungsvolle L�sung.
Echte Applikationen
Jetzt eine real world Applikation, wo Xdialog/dialog wirklich einen Vorteil �ber konventionelle Shellscriptprogramme bieten: Ein Men�, wo man verschiedene Internet Service Provider ausw�hlen und dann anw�hlen kann, um eine Internetverbindung aufzubauen. Dieses Skript erfordert ppp-on/ppp-off Skripte des M�rz 2001 Artikels Benutzen verschiedener
ISPs f�r deine Internetverbindung. Das Skript hei�t pppdialout und zeigt ein unterschiedliches Men�, abh�ngig davon, ob man online ist oder nicht.
#!/bin/sh
#
#DIALOG=Xdialog
DIALOG=dialog
#
# name of your default isp:
defaultisp=maxnet
#
error()
{
echo "$1"
exit 2
}
help()
{
cat <<HELP
pppdialout -- select an ISP and dial out.
All available ISPs must have a config file in /etc/ppp/peers
pppdialout executes the ppp-on/ppp-off scripts as described
in http://linuxfocus.org/English/March2001/article192.shtml
pppdialout, copyright gpl, http://linuxfocus.org/English/November2002
HELP
exit 0
}
# parse command line:
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;; # function help is called
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
tempfile=/tmp/pppdialout.$$
trap "rm -f $tempfile" 1 2 5 15
# check if we have a ppp network interface
if /sbin/ifconfig | grep '^ppp' > /dev/null; then
# we are already online
$DIALOG --title "go offline" --yesno "Click YES to \
terminate the ppp connection" 0 0
rval="$?"
clear
if [ "$rval" = "0" ]; then
echo "running /etc/ppp/scripts/ppp-off ..."
/etc/ppp/scripts/ppp-off
fi
else
# no ppp connection found, go online
# get the names of all available ISP by listing /etc/ppp/peers
for f in `ls /etc/ppp/peers`; do
if [ -f "/etc/ppp/peers/$f" ]; then
isplist="$isplist $f =="
fi
done
[ -z "$isplist" ]&&error "No isp def found in /etc/ppp/peers"
#
$DIALOG --default-item "$defaultisp" --title "pppdialout" \
--menu "Please select one of\
the following ISPs for dialout" 0 0 0 $isplist 2> $tempfile
rval="$?" # return status, isp name will be in $tempfile
clear
if [ "$rval" = "0" ]; then
isp=`cat $tempfile`
echo "running /etc/ppp/scripts/ppp-on $isp..."
/etc/ppp/scripts/ppp-on "$isp"
else
echo "Cancel..."
fi
rm -f $tempfile
fi
# end of pppdialout
Wie das Skript arbeitet:
Zu Beginn definieren wir einige Funktionen, error und help, als n�chstes �berpr�fen wir die Kommandozeilenargumente, dann wird ein Name f�r eine tempor�re Datei definiert (/tmp/pppdialout.$$). $$ ist der Name des laufenden Prozesses und ist eine einzigartige Zahl f�r jeden Computer. Das trap
statement wird ausgef�hrt, wenn das Programm unnormal beendet wird (z.B. wenn die Benutzerin crtl-C dr�ckt) und l�scht in unserem Fall das tempfile. Danach �berpr�fen wir, ob wir schon online sind oder nicht (Befehl: /sbin/ifconfig | grep '^ppp'). Wenn wir schon online sind, dann �ffnet sich eine yesno-box, wie du oben bereits eine gesehen hast, und fragt die Benutzerin, ob sie offline gehen m�chte. Wenn wir nicht online sind, wird eine Men�box ge�ffnet. Wir bekommen alle verf�gbaren ISPs durch Auflisten der Dateien in /etc/ppp/peers (ls
/etc/ppp/peers). Die Syntax der Men�box ist:
dialog --menu "text" <height>
<width> <menu height> <tag1>
<description> ...
<height>, <width> und <menu height> werden wieder auf 0 gesetzt (automatische L�nge, siehe oben) und dann erwartet das Programm Paare von Zeichenketten (<tag1> <description>). Wir haben keine wirkliche Beschreibung, deshalb setzen wir sie auf etwas Bedeutungsloses(== in diesem Fall). Die Datei in der Variablen isplist sieht so aus:
isp1 == isp2 == isp3 ==
Das Ergebnis der Benutzerauswahl wird von (X)dialog in Standarderror geschrieben. Der Shellbefehl "2> $tmpfile" schreibt es in unser
tmpfile. Die Men�box bietet auch die M�glichkeit, auf Abbrechen zu dr�cken. Deshalb m�ssen wir $? (exit status) �berpr�fen, um herauszufinden, welcher Knopf gedr�ckt wird.
Ok, genug Theorie. Hier ist, wie es aussieht
... als nettesGTK GUI mit Xdialog:
... mit dem curses basierten dialog in einem Terminal:
Weitere Applikationen
Wir haben noch eine weitere Anwendung f�r dich. Sie hei�t mktgz und
benutzt die checklist Box von Xdialog. Das einfache terminal-basierte
dialog besitzt keine Checkliste, deshalb l�uft sie nur mit Xdialog. Du kannst mktgz benutzen, um tar.gz Pakete zu bauen.
mktgz yourpackage .
Dies zeigt alle Dateien des aktuellen Arbeitsverzeichnisses
(".") und du kannst ausw�hlen, welche in dein
yourpackage.tar.gz Paket mit eingeschlossen werden sollen. Du kannst es hier (mktgz.txt) herunterladen.
Wir gehen nicht Zeile f�r Zeile durch den Code, da du schon genug wissen solltest, um das Skript lesen zu k�nnen.
Xdialog und dialog kommen mit einem Verzeichnis namens "samples", wo du weitere Beispiele finden kannst (Redhat 7.3 speichert sie unter /usr/share/doc/Xdialog-2.0.5/samples).
Sei aber vorsichtig, da einige von ihnen wirklich etwas tun und nicht blo� reine Demoapplikationen sind.
Schlu�bemerkung
Xdialog und dialog bieten eine Reihe verschiedener Dialogboxen. Nicht alle von ihnen sind immer f�r alle Typen von Shellscripten angebracht. Die Shell selbst ist auch eine sehr "m�chtige" Umgebung. Vervollst�ndigen eines Pfades mit der tab-Taste kann sehr viel schneller sein, als das Durchsuchen verschiedener Verzeichnisse in einem GUI und sie dann durch Dr�cken auszuw�hlen.
Besonders die M�glichkeit des Pipelinens und Verbindens von Befehlen macht die Shell zu einem sehr m�chtigen Werkzeug. Etwas wie:
grep -i "somestring" file.txt | sort | uniq | wc -l
(f�r diejenigen, die nicht so erfahren sind mit Unixshells: Dies z�hlt alle unterschiedlichen Zeilen in file.txt, die die Zeichenkette
"somestring" enthalten).
Solche Pipelinekonstrukte sind m�glich, weil alle Befehle von Kommandozeilenargumenten gesteuert werden. In anderen Worten: sie halten nicht an und fragen die Benutzerin, wie sie weitermachen m�chte.
Es gibt jedoch Applikationen, wo grafische Dialoge sehr n�tzlich sind. Xdialog und dialog sind sehr einfach zu benutzen, aber nat�rlich nicht so m�chtig wie eine echte grafische Anwendung. Sie schlie�en die L�cke zwischen einem reinen ASCII
Shellscript und einer vollst�ndigen grafischen Anwendung.
Wo bekommt man Xdialog und dialog?
Die CDs deiner Linuxdistribution sind der erste Platz, um nach dialog und Xdialog zu suchen. Es k�nnte sein, da� sie schon auf deinem Computer installiert sind (frag deinen Computer z.B. rpm -qil Xdialog, dpkg -L Xdialog).
Die Homepage von Xdialog ist:
http://www.chez.com/godefroy/
und dialog ist unter
http://hightek.org/dialog/
Du kannst dialog/Xdialog auch von dort herunterladen.
Referenzen