Home / LinuxUser / 2004 / 02 / Shell-Skripte mit grafischen Dialogen

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

War doch klar...
(243 Punkte bei 15 Stimmen)
Re: War doch klar...
(179 Punkte bei 5 Stimmen)
Re: Skype für 64-Bit-Prozessor u. Suse 12.1
(161 Punkte bei 4 Stimmen)
Kubuntu verliert Finanzierung
(130 Punkte bei 4 Stimmen)
Offen fürs Geschäft
(80 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Musik, lecker angerichtet

Shell-Skripte mit grafischen Dialogen

01.02.2004 Dass sich Shell-Programmierung und grafische Oberflächen nicht ausschließen, zeigt KDialog: Nie war es leichter, Shell-Skripte um User-Interaktion zu ergänzen.

Viele Problemchen, die beim täglichen Arbeiten mit Linux auftreten, lassen sich recht einfach durch Shell-Skripte lösen. Sobald jedoch mehr Benutzerinteraktion als die Ausgabe einer Textmeldung auf der Kommandozeile gefragt ist, lautet die landläufige Meinung: "Hier sind 'richtige Programmiersprachen' und GUI-Toolkits gefragt." Doch nicht alle mögen sich in C, Java oder C++ einarbeiten, und auch Qt [12] und GTK lernt man nicht mal eben an einem Nachmittag. Tatsächlich ist das oft gar nicht nötig, denn Shell-Programmierung und grafische Oberflächen schließen sich nicht grundsätzlich aus.

Die wohl bekannteste Kombination dieser Art besteht aus der – unter Linux eher unüblichen – Shell tcsh, die die Tool Command Language" Tcl [13] als Skriptsprache benutzt, und dem Tk-Toolkit. Aber auch, wer ohnehin die Linux-Standardshell Bash [5] nutzt, muss nicht verzagen. Da gibt es zum einen die Möglichkeit, mit dem Konsolen-Tool dialog [2,14] pseudografische Anwendungen auf der Basis der ncurses-Bibliothek zu gestalten. Wie das aussieht, wissen alle, die SuSEs yast im Textmodus verwenden oder zur Kernel-Konfiguration den Befehl make menuconfig verwenden.

Echte grafische Dialoge für Progrämmchen, die auf der grafischen Oberfläche laufen sollen, erhält man mit xdialog [1], gdialog [3] oder kdialog. Skripte, die kdialog verwenden, sehen praktisch aus wie KDE-Programme. Da dieses Tool Bestandteil des Kernpakets kdebase aller einigermaßen aktuellen Versionen ist, brauchen KDE-User ihre Systeme nicht einmal nachrüsten.

So ausgestattet lässt sich zum Beispiel ein kleines grafisches Tool namens mp3finder.bash schreiben, das beim Füttern der Mediaplayer xmms oder noatun mit auf der Platte verstreuten MP3-Dateien hilft. Es sucht die Dateien zusammen, holt sich dazu Informationen wie Titel und Bitrate, erlaubt es, den gewünschten Player festzulegen, offeriert die gefundene Musik und spielt gewählte Titel anschließend ab.

Der Vorteil von Shellskripten: Man muss das Rad nicht ständig neu erfinden, sondern kann ganz einfach all die Kommandozeilenprogramme einbinden, die das System zu bieten hat (ein Verfahren, das bei unachtsamer Weitergabe des Skripts an Dritte allerdings auch das Ergebnis "Funktioniert nicht" nach sich ziehen kann). So kommt in unserem Beispiel mp3info [4] als Tool zum Auslesen der ID3-Tags von MP3-Dateien zum Einsatz.

Das Rezept

Doch zunächst müssen wir die auf dem System verstreuten MP3-Dateien erst einmal finden. Auf der Kommandozeile übernimmt der Standard-Unix-Befehl find diese Aufgabe. Er sucht Dateien und Verzeichnisse anhand unterschiedlicher Parameter wie dem letzten Änderungsdatum oder dem Namen. So nimmt der Befehl

find $pfad -type f -iname "*.mp3" -exec ./mp3infos.bash {} \; 2> /dev/null >> ~/.mp3liste

die Variable pfad und lässt sich ihren Inhalt durch Voranstellen eines $ ausgeben. Das sollte das Verzeichnis sein, von dem ausgehend die Suche nach Dateien (-type f; -f steht für "file") beginnt, deren Dateiname mit irgendwelchen Zeichen beginnt (*) und auf .mp3, .mP3, .Mp3 oder .MP3 endet. Dass find ohne Ansehen der Groß- und Kleinschreibung, also "case-insentitive" arbeitet, dafür sorgt die Option -iname.

Aus jeder gefundenen Datei soll mp3info ein paar Informationen zum Titel und zur Bitrate zusammenklauben. Dafür schreiben wir ein eigenes Skript namens mp3infos.bash (Listing 2), das im Arbeitsverzeichnis (abgekürzt: .) liegt. Die find-Option -exec sorgt dafür, dass es aufgerufen wird, und dank {} bekommt es den von find $pfad -type f -iname "*.mp3" jeweils gefundenen Dateinamen als Argument mit auf den Weg. Findet find mehr als eine Datei, muss ./mp3infos.bash mehrfach ausgeführt werden.

Hier kommt uns zu Gute, dass man der Shell hintereinander mehrere Befehle in einem Rutsch mitgeben kann, wenn man sie durch Semikola trennt, weshalb wir nach dem Befehl ./mp3infos.bash {} ein ; hinschreiben. Um es vor der Shell zu schützen, wenn sie sich die gesamte Kommandozeile zum ersten Mal anschaut, muss ein \ davor. Leider hat die Variante mit -exec einen großen Nachteil: Findet find sehr viele Dateien, wird die intern generierte Kommandozeile

./mp3infos.bash datei1.mp3
; ./mp3infos.bash datei2.Mp3
; ./mp3infos.bash datei3.mP3
; [usw.]

sehr lang – und da all diese Prozesse parallel starten, übersteigt das unter Umständen die System-Ressourcen; die Shell beschwert sich dann mit einer Fehlermeldung. Zwar gibt es mit dem weiter unten erwähnten xargs eine (dank serieller Abarbeitung) ressourcenschonendere Alternative, die an dieser Stelle aber zu weit führte.

Um die Ausgabe von mp3infos.bash später weiterverwenden zu können, hängen wir sie dank >> an die versteckte Datei .mp3liste im Home-Verzeichnis (~) an. Da find auch versucht, nicht freigegebene Verzeichnisse zu durchsuchen, schicken wir die dabei produzierten Fehlermeldungen mit 2> /dev/null ins Nirvana.

An dieser Stelle kommt das erste Mal kdialog ins Spiel: Die Variable pfad, die der find-Aufruf braucht, muss zuvor mit Inhalt gefüllt werden – am besten, indem wir eine Eingabebox präsentieren, in dem wir das Startverzeichnis für die Suche abfragen:

kdialog --inputbox "Wo soll die Suche starten?"

Wollen wir als sinnvollen Default-Wert das Home-Verzeichnis vorgeben, fragen wir

kdialog --inputbox "Wo soll die Suche starten?" "$HOME"

und erhalten einen Dialog wie in Abbildung 1. Wird er geschlossen, gibt kdialog auf der Kommandozeile den jeweiligen Eingabewert aus. Der lässt sich mittels Kommandosubstitution der Variablen pfad zuweisen:

pfad=`kdialog --inputbox "Wo soll die Suche starten ?" "$HOME"`

Abbildung 1: Kdialog-Inputboxen nehmen Texteingaben entgegen

Zutaten holen

Um die MP3-Liste in ~/.mp3liste nicht bei jedem Start des Skripts neu aufbauen zu müssen, binden wir vor den Verzeichnis-Dialog die in Abbildung 2 dargestellte Abfrage ein:

kdialog --yesno "Soll die mp3-Liste neu geladen werden?"

Nur, wenn eine positive Antwort zurückkommt (if kdialog --yesno ...), machen wir in Listing 1 (then) die Verzeichnisbox auf. Das Ende der Wenn-Dann-(if-then-)Konstruktion kennzeichnet in der Bash das Stichwort fi. Damit diese Entscheidungsfrage überhaupt nur auftaucht, wenn die MP3-Liste bereits existiert und lesbar ("readable") ist (test -r ~/.mp3liste) – anderenfalls muss die Datei ohnehin erzeugt werden, erweitern wir die eine Bedingung um eine zweite:

if test ! -r ~/.mp3liste || kdialog --yesno "Soll die mp3-Liste neu geladen werden?"

Steht ein || zwischen mehreren Bedingungen, geht die Shell so lange alle so aufgereihten Einzelabfragen durch, bis sie das erste Mal eine "Ja, stimmt"-Antwort erhält: Dann ist die if-Abfrage erfüllt, und das Shell-Skript wird mit den Kommandos nach dem then fortgesetzt. Bekommt sie hingegen durchgehend abschlägige Bescheide, geht es nach einem eventuell vorhandenen else weiter.

Das Ausrufezeichen in der ersten Bedingung dreht den Spieß um: Ist die Liste nicht lesbar, steht in der Bedingung der if-Abfrage ein "ja, richtig", die Abfragebox wird übergangen, und die Verzeichnisbox erscheint.

Abbildung 2: Noch einmal nachgefragt

Abbildung 3: Fehler aufgetreten!

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

1381 Hits
Wertung: 46 Punkte (3 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 03/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Duden Korrektor unter 64-Bit
Duden Korrektor unter 64-Bit
Tim Schürmann, 06.02.2012 10:36, 0 Kommentare

Der Duden Korrektor bietet eine äußerst nützliche Rechtschreib- und Grammatikkorrektur für LibreOffice und bringt in der aktuellen Version 8 e...

Aktuelle Fragen

Suse 12.1 Bootvorgang bleibt seit Update stehen
Wimpy *, 12.02.2012 09:22, 0 Antworten
Seit Update auf Kernel 3.1.9-1.4-desktop i686 bleibt der Bootvorgang stehen. Es erscheint der gr...
N24 Stick (Huawei E173) und Ubuntu 11.04
Patrick Obenauer, 11.02.2012 11:54, 1 Antworten
Hallo zusammen! Ich benutze einen alten Laptop, der mit Ubuntu 11.04 flott und problemlos läuft....
Wie kann man beim Einsatz von Compiz die Fenster-Dekoration einstellen?
GoaSkin , 10.02.2012 20:12, 0 Antworten
Hallo, ich nutze Linux Mint mit dem Gnome-Derivat Mate. Da die Distribution Compiz nicht autom...
rndc reload zone - failed bad zone
Ludwig jun. B., 06.02.2012 16:08, 2 Antworten
Schönen guten Tag, ich habe folgendes Problem. Immer wenn ich folgendes Kommando ausführen bek...
Skype für 64-Bit-Prozessor u. Suse 12.1
Klaus Sigerist, 05.02.2012 11:39, 3 Antworten
Hallo Gemeinde! Ich bin nur ein einfacher Nutzer und habe Probleme mit der Installation von Skyp...