<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.33"> <META NAME="LFCATEGORY" CONTENT="UNIXBasics"> <link rel="icon" href="../../common/images/lf-16.png" type="image/png"> <TITLE>lf267, UNIXBasics: (X)dialog: Sprechende Shells</TITLE> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-family:monospace,Courier } p.cl { color:#EE9500 } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } .mark { background-color:#e6e6ff } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://www.linuxfocus.org/~guido/dev/lfparser.html --> <!-- this is used by a number of tools: =LF=AUTHOR: Katja and Guido Socher =LF=CAT___: UNIXBasics =LF=TITLE_: (X)dialog: Sprechende Shells =LF=NUMBER: 267 =LF=ANAME_: article267.shtml --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar --> <!-- top navegation bar --> <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#2e2292"> <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width= "100%"> <TR><TD width="319"><IMG src="../../common/images/logolftop_319x45.gif" alt="[LinuxFocus-icon]" width="319" height="45" align="left" border="0"></TD> <TD class="top"> <TABLE summary="topbar_1_links" width="100%"> <TR align="right"> <TD class="top"><A class="nodec" href="../index.shtml"><FONT color= "#DDDDDD" size="2">Home</FONT></A> | <A class= "nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Plan</FONT></A> | <A class= "nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Index</FONT></A> | <A class="nodec" href="../Search/index.html"><FONT color= "#DDDDDD" size="2">Suchen</FONT></A> </TD> </TR> <TR align="right"> <TD class="top"> <HR width="100%" noshade size="1"> </TD> </TR> </TABLE> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end top navegation bar --> <!-- blue bar --> <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#00ffff"> <TD><IMG src="../../common/images/transpix.gif" width="1" height= "2" alt=""></TD> </TR> </TABLE> <!-- end blue bar --> <!-- bottom navegation bar --> <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center" width="94%"> <TR bgcolor="#000000"> <TD> <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width= "100%"> <TR align="center"> <TD WIDTH="20%"><A class="nodec" href="../News/index.shtml"><FONT color= "#FFFFFF">Nachrichten</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Archiv</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.shtml"><FONT color= "#FFFFFF">Links</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Über uns</FONT></A> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end bottom navegation bar --> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.4 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Dieses Dokument ist verfübar auf: <A href="../../English/November2002/article267.shtml">English</a> <A href="../../Castellano/November2002/article267.shtml">Castellano</a> <A href="../../ChineseGB/November2002/article267.shtml">ChineseGB</a> <A href="../../Deutsch/November2002/article267.shtml">Deutsch</a> <A href="../../Francais/November2002/article267.shtml">Francais</a> <A href="../../Italiano/November2002/article267.shtml">Italiano</a> <A href="../../Nederlands/November2002/article267.shtml">Nederlands</a> <A href="../../Russian/November2002/article267.shtml">Russian</a> <A href="../../Turkce/November2002/article267.shtml">Turkce</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT BIO ABOUT THE AUTHOR --> <TABLE ALIGN=LEFT BORDER=0 WIDTH="190" summary="about the author"> <TR> <TD> <!-- 2pdaIgnoreStart --> <!-- PALM DOC --> <TABLE BORDER=0 hspace=4 vspace=4 summary="pda download"> <TR> <TD> <font size=1> <img src="../../common/images/2doc.gif" width=34 align=left border=0 height=22 alt="convert to palm"><a href="http://cgi.linuxfocus.org/cgi-bin/2ztxt">Convert to GutenPalm</a><br>or <a href="http://cgi.linuxfocus.org/cgi-bin/2pda">to PalmDoc</a></font> </TD> </TR> </TABLE> <!-- END PALM DOC --> <!-- 2pdaIgnoreStop --> <br> <img src="../../common/images/KatjaAndGuido.jpg" alt= "[Photo of the Authors]" height="150" width="168"> <BR>von Katja and Guido Socher <br> <small><katja(at)linuxfocusorg, guido(at)linuxfocus.org></small> <BR><BR> <I>Über die Autoren:</I><BR> <p>Katja ist die deutsche Editorin von LinuxFocus. Sie mag Tux, Film & Fotografie und das Meer. Ihre Homepage befindet sich <a href="http://linuxfocus.org/~katja/">hier</a>.</p><p>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 <a href= "http://linuxfocus.org/~guido/">linuxfocus.org/~guido</a>.</p> <!-- TRANSLATED TO de --> <BR><BR><I>Übersetzt ins Deutsche von:</I><BR> Katja Socher <small><katja(at)linuxfocus.org></small> <br> <!-- =LF=TRANSTO=de: Katja Socher --> <!-- TRANSLATED TO STOP --> <BR><i>Inhalt</i>: <UL> <LI><A HREF="#267lfindex0">Einführung</A></LI> <LI><A HREF="#267lfindex1">Komm herein zu (X)dialog...</A></LI> <LI><A HREF="#267lfindex2">Wie es arbeitet</A></LI> <LI><A HREF="#267lfindex3">Echte Applikationen</A></LI> <LI><A HREF="#267lfindex4">Weitere Applikationen</A></LI> <LI><A HREF="#267lfindex5">Schlußbemerkung</A></LI> <LI><A HREF="#267lfindex6">Wo bekommt man Xdialog und dialog?</A></LI> <LI><A HREF="#267lfindex7">Referenzen</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=267">Talkback für diesen Artikel</A></LI> </UL> </TD></TR></TABLE> <!-- HEAD OF THE ARTICLE --> <br> <H2>(X)dialog: Sprechende Shells</H2> <img src="../../common/images/article267/shelltalk.jpg" width="200" height="202" alt="[Illustration]" hspace="10"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Zusammenfassung</i>: <P> 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 <a href="../September2001/article216.shtml"> Shell Programmierung</a> lesen. <br><!-- HR divider --><center><font color="#8282e0"><b>_________________ _________________ _________________</b></font></center><br> <!-- BODY OF THE ARTICLE --> <A NAME="267lfindex0"> </A> <H2>Einführung</H2> Die UNIX Shell ist eine sehr produktive Umgebung für sich genommen und arbeitet sehr gut ohne grafische Benutzerschnittstelle. <br> 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.... <A NAME="267lfindex1"> </A> <H2>Komm herein zu (X)dialog...</H2> 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.<br> Hier ist ein Beispiel: <br> Du kannst die folgenden Zeilen in ein Shellfenster (xterm, konsole,....) tippen (oder kopieren/pasten): <br clear="all"> <p class="code">bash<br> Xdialog --yesno "Do you want to learn more about Xdialog?" 0 0;\<br> case $? in<br> 0)<br> echo "Result: Yes chosen.";;<br> 1)<br> echo "Result: No chosen.";;<br> 255)<br> echo "ESC pressed.";;<br> esac<br> </p> Die Box, die erscheint, sieht so aus: <br> <center> <br> <img src="../../common/images/article267/yesno.gif" width= "274" height="95" alt="[yes/no Xdialog]"> </center> <br> 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.<br> <center> <br> <img src="../../common/images/article267/yesno_noX.gif" width="440" height="340" alt="[yes/no dialog]"> </center> <br> 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ß <p class="code"><a href="../../common/src/article267/dialog_help.html">dialog --help</a><br> oder<br> <a href="../../common/src/article267/Xdialog_help.html">Xdialog --help</a><br> </p> laufen, um eine Liste der vorhandenen Dialogboxen zu bekommen. Xdialog hat ein paar mehr Boxen als dialog. <A NAME="267lfindex2"> </A> <H2>Wie es arbeitet</H2> Die Dialogkästen werden auf der Kommandozeile konfiguriert. <p class="code">dialog --yesno "text string" <height> <width></p> Nach dem Tippen von dialog oder Xdialog muß man den Namen der gewünschten Box angeben, gefolgt von ihren spezifischen Parametern. <br><br> 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.<br> <br> Eine sehr einfache, aber wirkungsvolle Lösung. <A NAME="267lfindex3"> </A> <H2>Echte Applikationen</H2> 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 <a href= "../March2001/article192.shtml">Benutzen verschiedener ISPs für deine Internetverbindung</a>. Das Skript heißt <a href= "../../common/src/article267/pppdialout.txt">pppdialout</a> und zeigt ein unterschiedliches Menü, abhängig davon, ob man online ist oder nicht. <!-- translators: please do _not_ translate this script --> <pre> #!/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 </pre> <b>Wie das Skript arbeitet:</b><br> 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: <p class="code">dialog --menu "text" <height> <width> <menu height> <tag1> <description> ...</p> <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: <p class="code">isp1 == isp2 == isp3 ==</p> 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. <br> <br> Ok, genug Theorie. Hier ist, wie es aussieht <br><br> <center> ... als nettesGTK GUI mit Xdialog:<br><br> <img src="../../common/images/article267/xdialog_1.gif" width="292" height="167" alt="[pppdialout with xdialog]"><br> <img src="../../common/images/article267/xdialog_2.gif" width="274" height="95" alt="[pppdialout with xdialog]"><br><br> ... mit dem curses basierten dialog in einem Terminal:<br><br> <img src="../../common/images/article267/dialog_1.gif" width= "503" height="353" alt="[pppdialout with dialog]"><br> <img src="../../common/images/article267/dialog_2.gif" width= "503" height="353" alt="[pppdialout with dialog]"><br> <br> </center> <A NAME="267lfindex4"> </A> <H2>Weitere Applikationen</H2> 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. <p class="code">mktgz yourpackage .</p> 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 <a href= "../../common/src/article267/mktgz.txt">hier (mktgz.txt)</a> herunterladen. Wir gehen nicht Zeile für Zeile durch den Code, da du schon genug wissen solltest, um das Skript lesen zu können. <br> <br> 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. <A NAME="267lfindex5"> </A> <H2>Schlußbemerkung</H2> 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: <pre>grep -i "somestring" file.txt | sort | uniq | wc -l </pre> <small>(für diejenigen, die nicht so erfahren sind mit Unixshells: Dies zählt alle unterschiedlichen Zeilen in file.txt, die die Zeichenkette "somestring" enthalten). </small><br> 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. <br> 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. <br> <A NAME="267lfindex6"> </A> <H2>Wo bekommt man Xdialog und dialog?</H2> 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:<br> <a href= "http://www.chez.com/godefroy/">http://www.chez.com/godefroy/</a><br> und dialog ist unter <br> <a href= "http://hightek.org/dialog/">http://hightek.org/dialog/</a><br> Du kannst dialog/Xdialog auch von dort herunterladen. <A NAME="267lfindex7"> </A> <H2>Referenzen</H2> <ul> <li>Xdialog: <a href= "http://www.chez.com/godefroy/">http://www.chez.com/godefroy/</a><br> dialog: <a href= "http://hightek.org/dialog/">http://hightek.org/dialog/</a><br> </li> <li>Xdialog Dokumentation: <a href= "http://www.chez.com/godefroy/doc/index.html">http://www.chez.com/godefroy/doc/index.html</a><br> </li> <li> Andere LinuxFocus Artikel:<br> <ul> <li><a href="../March2001/article192.shtml"> Benutzen verschiedener ISPs für deinen Internetzugang</a><br></li> <li><a href="../September2001/article216.shtml"> Shellprogrammierung</a><br></li> </ul> </li> <li><a href= "../../common/src/article267/pppdialout.txt">pppdialout script</a></li> <li><a href="../../common/src/article267/mktgz.txt">mktgz script</a></li> </ul> <!-- vim: set sw=2 ts=2 et tw=74: --> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Talkback für diesen Artikel</h2> Jeder Artikel hat seine eigene Seite für Kommentare und Rückmeldungen. Auf dieser Seite kann jeder eigene Kommentare abgeben und die Kommentare anderer Leser sehen: <center> <table border="0" CELLSPACING="2" CELLPADDING="1" summary="tb-button-outerpart"> <tr BGCOLOR="#C2C2C2"><td align=center> <table border="3" CELLSPACING="2" CELLPADDING="1" summary="tb-button"> <tr BGCOLOR="#C2C2C2"><td align=center> <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=267"><b> Talkback Seite </b></a> </td></tr></table> </td></tr></table> </center> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%" summary="footer"> <TR><TD ALIGN=CENTER BGCOLOR="#9999AA" WIDTH="50%"> <A HREF="../../common/lfteam.html">Der LinuxFocus Redaktion schreiben</A> <BR><FONT COLOR="#FFFFFF">© Katja and Guido Socher, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT> </TD> <TD BGCOLOR="#9999AA"> <!-- TRANSLATION INFO --> <font size=2>Autoren und Übersetzer:</font> <TABLE summary="translators"> <tr><td><font size="2">en --> -- : Katja and Guido Socher <small><katja(at)linuxfocusorg, guido(at)linuxfocus.org></small></font></td></tr> <tr><td><font size="2">en --> de: Katja Socher <katja(at)linuxfocus.org></font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2002-10-31, generated by lfparser version 2.33</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>