Frage und Antwort
out of the box
Was darf's denn sein?
Eine relativ neue Option in dialog ist --file. Damit steht eine komfortable Dateiauswahl zur Verfügung. Das Shell-Skript in Listing 2 zeigt ein Anwendungsbeispiel, das jedoch nur mit einem neuen dialog, nicht mit der auf aktuellen Distributionen installierten Version 0.62 oder älter lauffähig ist.
Es zeigt einen Dateiauswahldialog, mit dem man ausgehend vom eigenen Home-Verzeichnis durchs Dateisystem brausen kann. Schließt man den Dialog durch Auswahl des OK-Buttons, erhält man Zeichen- und Zeilenzahl der letztgewählten Datei angezeigt.
Listing 2
Dateiauswahl mit Dialog
#!/bin/sh
dialog --backtitle "Textdatei öffnen" \
--title "Dateiauswahl" --clear \
--file $HOME 15 62 0 2>/tmp/dialog.file
file=$(cat /tmp/dialog.file)
rm /tmp/dialog.file
if [ ! -z $file ] ; then
echo $file enthält $(wc -l < $file) Zeilen und \
$(wc -c < $file) Zeichen.
fi
Der Option --file folgt das Startverzeichnis für die Dateiauswahl (in diesem Fall das Home-Verzeichnis des aktuellen Benutzers, das in der Umgebungsvariablen HOME gespeichert ist). Die nächsten beiden Werte bestimmen die Höhe (15) und Breite (62) der Box. Der nachfolgende Wert gibt den Modus für die Box an, mögliche Modi führt Tabelle 1 auf. Die Auswahl einer existierenden Datei (Modus 0) ist in Abbildung 4 dargestellt.
Ähnlich wie im vorigen Beispiel wird der Rückgabewert zunächst in eine temporäre Datei gespeichert und in die Variable file eingelesen. Ist diese Variable nicht leer (wird mit ! -z geprüft), so gibt das Skript unter Verwendung des Kommandos wc die Zeilen- und Zeichenzahl der gewählten Datei aus.
Tabelle 1: Modi für --file
| Modus | Bedeutung |
|---|---|
| 0 | Auswahl einer existierenden Datei |
| 1 | Auswahl eines existierenden Verzeichnisses |
| 2 | Eingabe eines existierenden oder nicht existierenden Verzeichnisses |
| 3 | Eingabe einer existierenden oder nicht existierenden Datei |
RTFM
dialog lässt sich auch als einfacher Pager zum Lesen von Textdateien gebrauchen. Hierzu verwenden Sie die Option --textbox. Um beispielsweise die Datei /etc/services zu lesen, geben Sie in der Shell dialog --title /etc/services --textbox /etc/services 18 70 ein. Zur Navigation im Text stehen die Cursor-Tasten, [Bild hoch],[Bild runter] und die Leertaste zur Verfügung. Mit [/] und [?] können Sie vorwärts bzw. rückwärts suchen.
Hinweise zu weiteren nützlichen dialog-Optionen wie Checklisten oder Eingabefeldern finden sich in der Manpage, die Sie mit man dialog aufrufen.
Kasten 1: Shell-Skripting
Für alle, die bisher noch nicht mit Shell-Skripten zu tun hatten, ein paar Erklärungen zu den Listings in diesem Artikel. Shell-Skripte sind Textdateien mit Folgen von Kommandos, die von der Shell nach dem Aufruf der Datei nacheinander abgearbeitet werden. Sie können die Abarbeitung auch an Bedingungen knüpfen (if-Kommando) oder Teile des Skripts wiederholen lassen (while- und for-Kommandos).
Zum Zwischenspeichern von Werten sind Variablen nützlich, die einfach dadurch entstehen, dass man einen Namen hinschreibt und ihm hinter einem Gleichheitszeichen einen Wert zuweist. An den Inhalt einer Variablen kommt man heran, indem man dem Variablennamen ein $ voranstellt.
Bei if-Konstrukten wird die eigentliche Bedingung oft mit dem Kommando test formuliert, das sich auch abgekürzt [ schreiben lässt. Einfache Vergleiche sind mit = möglich, aber auch Datei- und Zeichenkettenprüfungen werden durch Optionen zur Verfügung gestellt. So testet [ -f foo ], ob foo eine reguläre Datei ist; [ -z $bar ] prüft, ob der Inhalt der Variablen bar leer ist, und [ $a -gt $b ] sieht nach, ob der Inhalt von a (als Zahl interpretiert) größer als ("greater than") der von b ist.
Eine if-Abfrage muss für die Shell immer mit einem fi abgeschlossen werden. Dazwischen darf auch ein else-Zweig stehen, in dem alternative Bearbeitungsmöglichkeiten angegeben werden, die dann zum Zug kommen, wenn die if-Bedingung nicht erfüllt ist.
Die Schreibweise bla=$(kommando) führt zuerst das Kommando in der Klammer aus und setzt dessen Ausgabe dann an dieser Stelle in die restliche Kommandozeile ein, so dass die Ausgabe der Variablen bla zugewiesen wird. Dieser Mechanismus wird Kommandosubstitution genannt.
Um überlange Zeilen in Shell-Skripten lesbarer zu machen, können Sie vor das Zeilenende einen Backslash (\) schreiben. Damit weiß die Shell, dass die nächste Zeile als Fortsetzung der aktuellen anzusehen ist.
Sollen auf einer Zeile hingegen mehrere Kommandos abgesetzt werden, muss man sie mit Semikola voneinander trennen. Dies ist zum Beispiel nach einem if-Test der Fall. Stünde das darauf folgende Schlüsselwort then auf einer eigenen Zeile, wäre kein Semikolon nötig.
Außer der Standardausgabe und dem Standardfehlerausgabe, die normalerweise auf dem Bildschirm landen und mit > bzw. 2> in eine Datei umgeleitet werden können, kennt die Shell auch noch den Standardeingabekanal. Dieser ist normalerweise mit der Tastatur verknüpft, aber ein
Kommando < Datei
sorgt dafür, dass das Kommando die Daten bearbeitet, die in Datei stehen. Auf diese Art und Weise erhält das Kommando wc in Listing 2 die zu zählenden Zeilen und Zeichen aus dem in der Variablen file abgelegten Inhalt. (Christian Perle/Patricia Jung)
Glossar
Kernel
Der Betriebssystemkern bildet die Schnittstelle zwischen Hardware und laufenden Prozessen. Außerdem stellt er Multitasking und Speichermanagement zur Verfügung. Das eigentliche Linux ist nur der Kernel.
URL
"Uniform Resource Locator", die eindeutige Adresse einer Ressource im Netz. In der URL ist auch das Übertragungsprotokoll angegeben, z. B. http://www.linux.de/links/Distributionen/ oder ftp://ftp.gwdg.de/linux/mirrors/.
rpm
Mit dem "Red Hat Packet Manager" (den u. a. auch SuSE einsetzt) können Softwarepakete sauber installiert und deinstalliert werden. Das zugehörige Paketformat heißt ebenfalls RPM.
deb
Das Paketformat der Debian-Distribution. Mit dem Paketmanager dpkg oder dem komfortableren Frontend apt lassen sich solche Pakete bequem installieren und deinstallieren.
Shell
Einer der wichtigsten Bestandteile jedes Unix-Systems – die kommandozeilengesteuerte Benutzerschnittstelle.
$
Um den Inhalt einer Shell-Variablen herauszufinden, stellt man den Operator $ vor den Variablennamen.
RTFM
"Read The Fine Manual", der dezente Hinweis darauf, dass eine Dokumentation zum Durchlesen da ist.
Pager
Programm zum seitenweisen Anzeigen einer Datei. Verbreitete Pager sind more und less.



