BUGH Wuppertal Fachbereich 7 - Mathematik Axel Rogat
Betriebssysteme und betriebssystemnahes Programmieren
Übungsblatt 4

Aufgabe 8
Schreiben Sie ein kurzes Shell-Skript, das das Kommando which imitiert.

which erhält als Aufrufparameter Namen von Kommandos und gibt jeweils den absoluten Pfad der ausführbaren Datei aus, die den Programmcode des Kommandos enthält (bei mehreren Kommandos zeilenweise) - zu "xterm" beispielsweise "/usr/bin/xterm" (o.ä.).

Hinweise:

  • Sie müssen dazu die Umgebungsvariable $PATH auswerten, die die Namen der Directories enthält, in denen die Shell nach Kommandos sucht. Das in der angegebenen Reihenfolge erste gefundene Programm wird ausgeführt, und nur dessen Pfad sollen Sie natürlich auch ausgeben! Wenn ein Kommando gar nicht gefunden wird, geben Sie (wie das Original-which) nichts aus!

  • Wenn Sie which ganz exakt imitieren wollen, müssen Sie beachten, daß ein leerer Eintrag in $PATH (also zwischen zwei "::") für das aktuelle Verzeichnis "." steht!

Aufgabe 9
Schreiben Sie ein Shell-Skript listf, das die ganzen Zahlen von 1 bis zu einem Maximum m in Spalten formatiert ausgibt. Dabei sollen die Maximalzahl m, die Anzahl von Spalten und die Spaltenbreite als Optionen in der Aufrufzeile angegeben werden können.

Folgende Optionen sollen erlaubt sein:

-c columns Ausgabe mit columns Spalten, wobei columns>=1
-m maximum Ausgabe von 1 bis maximum, wobei maximum>=1
-w width Ausgabe mit Spaltenbreite width, wobei width>=1

Beispielsweise soll der Aufruf "listf -c 7 -w 5 -m 12" folgende Ausgabe erzeugen (der Deutlichkeit halber hier mit "·" statt Spaces):

····1····2····3····4····5····6····7 ····8····9···10···11···12

Wenn die Optionen nicht angegeben werden, sollen die Standard-Werte 4, 100, 8 (in dieser Reihenfolge) verwendet werden.

Hinweise:

  • Werten Sie die Optionen mit Hilfe von getopts aus. Testen Sie jeweils, ob das angegebene Argument numerisch ist (z.B. indem Sie mit expr versuchen, 0 darauf zu addieren). Testen Sie außerdem, ob das Argument größer als Null ist. Brechen Sie sonst mit einer Fehlermeldung ab.

  • Verwenden Sie zur Ausgabe das Kommando printf, das analog zur C-Version mit einem Formatstring arbeitet, beispielsweise "printf "%3d%-4d" 1 2". Sie müssen einmal den Format-String entsprechend den Angaben columns und width in einer Schleife zusammenbauen. Danach müssen Sie für jede Zeile den Argument-Teil mit einer Schleife zusammenbauen. Schließlich können Sie printf aufrufen!

Aufgabe 10
Schreiben Sie ein Shell-Skript, das menügesteuert xlogo-Fenster öffnet und schließt. (xlogo ist ein einfaches X-Window-Programm, das "X"-Symbol größenangepaßt in einem Fenster darstellt.)

Das Skript soll auf folgende Benutzer-Eingaben reagieren:

`+' öffnet ein neues xlogo-Fenster,
`-' schließt ein xlogo-Fenster (welches, s.u.),
`q' beendet das Programm und schließt alle noch offenen Fenster.

Diese Möglichkeiten sollen vor jeder Eingabe als ein kleines Menü ausgegeben werden. Leere Eingaben sollen ignoriert werden, ungültige Eingaben eine Warnung erzeugen. Ebenso soll bei einem `-' gewarnt werden, wenn kein xlogo mehr offen ist.

Durch ein CTRL-C soll das Programm auch beendet werden können, wobei ebenfalls alle Fenster geschlossen werden sollen!

Hinweise:

  • Öffnen Sie bei `+' ein Fenster, indem Sie einen neuen xlogo-Prozeß erzeugen. Das Schließen bei `-' erledigen Sie durch das Absetzen eines kill-Kommandos auf den entsprechenden Prozeß.

  • Die Fenster sollen in LIFO-Reihenfolge (last-in-first-out, wie bei einem Stack) geöffnet und wieder geschlossen werden. Sie müssen sich dazu die PIDs aller noch laufenden Prozesse in einer Liste merken.

  • Die Liste kann (durch Aneinanderhängen von Ausdrücken) leicht verlängert werden. Um sie wieder zu verkürzen, und um eine PID aus der Liste herauszuoperieren, verwenden Sie den Stream-Editor sed.

  • Beachten Sie unbedingt, daß der Benutzer zwischenzeitlich xlogo-Fenster durch Mausklicks (oder kill-Kommandos) geschlossen haben kann! Schließen Sie dennoch bei jedem `-' ein Fenster (also das nächste in der Liste, das tatsächlich noch offen ist)! Sie müssen dazu den Return-Code des kill-Kommandos auswerten. (Unterdrücken Sie außerdem dessen automatische Fehlerausgabe.)

  • Das CTRL-C fangen Sie mit einer trap-Anweisung zu Beginn des Skripts ab. Beachten Sie, daß im angegebenen Kommando vorkommende Variablen nicht zum Zeitpunkt der trap-Anweisung, sondern zum Zeitpunkt des CTRL-C eingesetzt werden müssen!

Was müssen Sie an Ihrem Skript ändern, damit die Fenster in FIFO-Reihenfolge (wie bei einer Warteschlange) geöffnet und geschlossen werden?

email: axel@math.uni-wuppertal.de Zurück Abgabe: 24.5.1999
 

© 1999 Axel Rogat