Shell-Skripte mit grafischen Dialogen

Musik, lecker angerichtet

,
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!

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Klacker, Klacker, Klick, Klick
    Häufig erledigen Skripte ihre Aufgaben unsichtbar im Hintergrund. Mancher User wünscht sich aber ein visuelles Feedback. Dank Zenity und KDialog fügen sich Ihre Skripte nativ in die KDE- oder Gnome-Umgebung ein.
  • Portabel programmieren mit Dialog, Gdialog und Kdialog
    Bash-Skripte sind meist nur für die Verwendung auf der Kommandozeile gedacht und schrecken Nicht-Experten mit unübersichtlichen Ausgaben ab. Das muss aber nicht so sein: Die Programme Dialog, Gdialog und Kdialog verstecken die Kommandozeile vollständig vor dem Benutzer.
  • Einführung in die Bash-Programmierung
    Skripte sollen meist wiederkehrende oder lästige Arbeiten automatisieren. Die Standard-Shell Bash stellt Ihnen dazu eine ganze Reige von Funktionen bereit. Dieser Artikel erklärt, wie Sie ihre eigenen Shell-Skripte schreiben.
  • Teil 7: Benutzerfreundliche Ein-/Ausgabe
    Im letzten Teil des Bash-Programmierkurses geht es um die benutzerfreundliche Gestaltung von Eingaben und Dialogen am Beispiel der Programme dialog, gdialog und kdialog.
  • Mehr Komfort
    Von einfachen Abfragen bis hin zu komplexen Menüs: Mit dem Toolkit Dialog bauen Sie eine grafische Oberfläche für Shell-Skripte, die oft nicht mehr als eine zusätzliche Zeile brauchen.
Kommentare

Infos zur Publikation

title_2016_06

Digitale Ausgabe: Preis € 5,99
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Aktuelle Fragen

thema ändern
a b, 29.05.2016 16:34, 0 Antworten
Hallo Linuxer zuerst alle eine schönen Sonntag, bevor ich meine Frage stelle. Ich habe Ubuntu 1...
Ideenwettbewerb
G.-P. Möller, 28.05.2016 10:57, 0 Antworten
Liebe User, im Rahmen eines großen Forschungsprojekts am Lehrstuhl für Technologie- und Innova...
Welche Drucker sind Linux-mint kompatibel?
Johannes Nacke, 20.05.2016 07:32, 4 Antworten
Hallo Ihr Lieben, ich bitte um mitteilung welche Drucker Kompatibel sind mit Linux-Mint. LG Joh...
MS LifeCam HD-5000 an Debian
Kay Michael, 13.04.2016 22:55, 0 Antworten
Hallo, ich versuche die oben erwähnte Cam an einem Thin Client mit Debian zu betreiben. Linux...
Import von Evolution nach KMail erzeugt nur leere Ordner
Klaus-Christian Falkner, 06.04.2016 12:57, 3 Antworten
Hallo, da ich vor einiger Zeit von Ubuntu auf Kubuntu umgestiegen bin, würde ich gerne meine E...