GUI-Komfort für Bash, Shell und Co.

Aus LinuxUser 06/2008

GUI-Komfort für Bash, Shell und Co.

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.

Linux-Anfänger jubeln selten begeistert auf, wenn sie auf die Kommandozeile müssen: Der Schritt weicht vom gewohnten Umgang mit Computern ab. Aber auch fortgeschrittene Anwender wüssten mitunter gern, was das selbstgebaute Skript gerade so treibt. Wer gern viel mit der Maus erledigt, dem erleichtern Gnomes Zenity und KDEs KDialog das Leben.

Die Software landet bei der Installation von OpenSuse, Ubuntu und Kubuntu automatisch auf Ihrem Rechner – abhängig davon, ob Sie Gnome oder KDE installieren. Auch KDE 4 hat bereits KDialog im Gepäck, wie die Screenshots beweisen. Andernfalls installieren Sie die Pakete kde4-dialog respektive zenity nach. Wollen Sie Ihr Skript weitergeben, sollten Sie eine kleine Abfrage einbauen, die prüft, ob Zenity und KDialog auf dem fremden Rechner laufen. Anschließend statten Sie Ihre Bash- und Shell-Skripte mit Gnomes GTK-Dialogen und KDEs Qt-Fenstern aus.

Starten Sie dann ein Skript, poppen Dialogfenster auf, die Fragen stellen, Informationen liefern oder Sie über den Fortgang eines Prozesses informieren. Dieses grafische Feedback fehlt in Skripten gewöhnlich. Auch Fehlermeldungen und allgemeine Statusinformationen liefern Zenity und KDialog in Form von visuellen Rückmeldungen. Pfade tippen Sie nicht mehr mühevoll per Hand ein, sondern wählen sie über einen grafischen Dateimanager aus. Schön auch: Zenity und KDialog lassen sich sehr einfach einbinden. Wir zeigen Ihnen, welche Arten von Dialogfenstern es gibt und wie Sie diese einsetzen.

Zenity in Aktion

Sie beginnen am besten mit dem einfachen Shell-Skript aus Listing 1. Speichern Sie es unter dem Namen zenity, machen Sie es über chmod u+x zenity ausführbar und rufen Sie es dann über ./zenity auf. Sie sehen nun einen Schieberegler wie in Abbildung 1. Da das Dialogfenster keinen Namen trägt und der Text für den Schieberegler noch fehlt, greift Zenity auf Standardbeschriftungen zurück.

Listing 1
#!/bin/sh
zenity --scale

Die Tabelle “Zenity” zeigt, welche Typen von Dialogfenstern es gibt. Links sehen Sie den Parameter, mit dem Sie Zenity aufrufen. Daneben sehen Sie jeweils ein Bild des Dialogfeldes.

Wie man dort sehen kann, gibt es auch Felder, in die Sie Werte eingeben. Die liest die Bash nach einem Klick auf OK ein, etwa beim Eingabefeld (--entry). Nutzen Sie den Schieberegler (--scale), um der Bash einen bestimmten Zahlenwert zu übergeben. Gefundene Informationen listen Sie mit Hilfe von --list auf – sie lassen sich nach einem Klick auf den Feldnamen auch sortieren. Einen Fortschrittsbalken setzen Sie nur dort ein, wo es auch Fortschritt gibt: So lässt sich etwa eine Suchaktion grafisch begleiten. Zunächst aber ein paar Basics.

Aufbauspiel

Um Fenstern einen eigenen Namen zu geben, setzen Sie generell --title ein (Listing 2, Zeile 1). Das sieht dann aus wie in Abbildung 1, aber nun fehlt noch etwas Funktionalität. Die Zeile 2 von Listing 2 zeigt, wie Sie Benutzer Werte zwischen Eins (--min-value=1) und Zehn (--max-value=10) auswählen und mit einem Standardwert von Fünf (--value=5) beginnen lassen.

Abbildung 1: Über einen Schieberegler generieren Anwender mit Hilfe eines grafischen Tools Zahlen.

Abbildung 1: Über einen Schieberegler generieren Anwender mit Hilfe eines grafischen Tools Zahlen.

Listing 2
zenity --scale --title "Schieberegler" --text "Schieben Sie ruhig ein bisschen…"
zenity --scale --title "Schieberegler" --text "Schieben Sie ruhig ein bisschen…" --min-value=1 --max-value=10 --value=5

Natürlich gibt es nicht unendlich viele Parameter, mit denen Sie den Schieberegler füttern dürfen: man zenity zeigt in einem eigenen Abschnitt mit der Überschrift Scale Options, welche Optionen zusammen mit --scale funktionieren. Für ein Warnfeld (--warning) können Sie beispielsweise nur den Text festlegen und Umbrüche markieren.

Einige Typen entfalten ihre Wirkung auch nur in Verbindung mit anderen Befehlen. Das folgende Kommando zeigt die Dateien eines Verzeichnisses in einer Liste an und sortiert sie alphabetisch, sobald Sie auf Verzeichnisinhalt klicken (Abbildung 2):

ls | zenity --list --column "Vererzeichnisinhalt"
Abbildung 2: Zenity listet den Inhalt eines Verzeichnisses auf und sortiert ihn beim Klick auf     <code srcset=

Verzeichnisinhalt alphabetisch.” width=”300″ height=”265″ /> Abbildung 2: Zenity listet den Inhalt eines Verzeichnisses auf und sortiert ihn beim Klick auf Verzeichnisinhalt alphabetisch.

Zwar bastelt Zenity Ihnen schöne grafische Menüs, das Entwickeln der Programmlogik nimmt es Ihnen allerdings nicht ab. Um zu entscheiden, was ein Skript tut, wenn Sie auf OK oder Abbrechen drücken, schreiben Sie eine kleine If-Abfrage (Listing 3).

Listing 3
kdialog --yesno "Wollen Sie die Datei wirklich löschen?"
  if [ $? = 0 ]; then
    echo "OK gewählt"
    Hier fügen Sie beliebigen Code zum Ausführen ein.
  else
    echo "Abbrechen gewählt"
  fi

Generell gibt es bei Zenity und KDialog zwei interne Rückgabewerte für die eingesetzten Dialogfelder: Ein positives Ergebnis (OK) gibt “0”, ein negatives “1” (Abbrechen) und ein drittes Ergebnis – beispielsweise Cancel von KDialog – “2” zurück. Abfragen können Sie diese Rückgabewerte, indem Sie die Variable $? auswerten.

Oberflächliches KDE

KDialog-Nutzer erzeugen auf ähnlich einfache Weise grafische Dialogfenster. Die Tabelle “KDialog” zeigt, welche Aufrufe welche Elemente produzieren. KDialog bringt allerdings ein paar zusätzliche Fenster mit, die Zenity nicht kennt. Um etwa eine Passwortabfrage zu realisieren, nutzen Sie den Befehl:

kdialog --yesno "Wollen Sie die Datei wirklich löschen:"

Die entsprechende Frage erscheint dann in einem Feld mit den Schaltern OK und Abbrechen. Wollen Sie das Feld noch mit einem Titel versehen, hilft der Parameter title (Abbildung 3):

kdialog --title "Ja oder Nein" --yesno "Wollen Sie die Datei wirklich löschen?"
Abbildung 3: KDialog erstellt im Handumdrehen einen Ja/Nein-Dialog, meckert aber, wenn Sie dem Kommando keinen Text mit auf den Weg geben.

Abbildung 3: KDialog erstellt im Handumdrehen einen Ja/Nein-Dialog, meckert aber, wenn Sie dem Kommando keinen Text mit auf den Weg geben.

Anders als Zenity beschwert sich KDialog übrigens, wenn Sie nur kdialog --yesno eingeben und ein Text fehlt – das Programm stellt keine Standardtexte bereit.

Geben Sie in ein Feld eigenen Text ein, erscheint dieser gewöhnlich auf der Konsole, da sie als Standardausgabe dient. Über eine Pipe leiten Sie die Ausgabe in eine Datei namens datei.txt um (Listing 4, Zeile 1). Alternativ verpacken Sie das Ergebnis in einer Variablen (Listing 4, Zeilen 2 und 3). Beachten Sie an dieser Stelle die Backticks, die den KDialog-Teil umschließen.

Listing 4
kdialog --inputbox "Sinnlosen Text bitte hier eingeben:" > datei.txt
variable=$(kdialog --inputbox "Mehr sinnlosen Text hier eingeben:")
echo $variable

Zusätzlich zu den hier genannten Meldungen sorgt der Schalter --dontagain dafür, dass KDialog eine bestimmte Frage nicht ständig wiederholt. Zusätzlich zur Ja/Nein-Auswahl erscheint dann ein Kästchen zum Ankreuzen mit der Beschriftung Do not show this message again:

kdialog --dontagain merkdatei:entscheidung --yesno "Wollen Sie die Datei wirklich löschen?"

Der Eintrag merkdatei:entscheidung sorgt dafür, dass der Dialog sich Ihre Wahl tatsächlich merkt. KDialog legt unter ~/.kde/share/config/ eine Datei namens merkdatei an und legt Ihre Entscheidung in der gleichnamigen Variable ab, wie folgender Test zeigt:

$ cat ~/.kde/share/config/merkdatei
[Notification Messages]
entscheidung=yes

In diesem Fall würde das Skript jede Wiederholung der Frage automatisch mit “Ja” beantworten. Die Dialogfelder von KDialog kennen in der Regel noch weitere Schalter, ein paar möchten wir hier vorstellen. Alternativ helfen Ihnen auch man kdialog und eine Übersicht im KDialog-Handbuch [1] mit Details weiter.

Die Option –passivepopup bietet etwa einen Ansatz, über den Sie Nutzern eine kurze Notiz zukommen lassen. Sie öffnet sich als Sprechblase in einem Fenster und tut dem Anwender etwas kund (Abbildung 4). Über eine einfache Zahl nach dem Text legen Sie fest, wie lange der Text erscheint (in Zeile 1 von Listing 5 für fünf Sekunden). Über die Sequenz /n brechen Sie Texte auf Dialogfeldern um, falls diese den Schalter zu sehr in die Breite ziehen.

Abbildung 4: Der User sieht eine Information, die allerdings keinen Fokus erhält. Er kann derweilen ruhig weiterarbeiten.

Abbildung 4: Der User sieht eine Information, die allerdings keinen Fokus erhält. Er kann derweilen ruhig weiterarbeiten.

Wollen Sie eine bestimmte Datei von der Festplatte auswählen, bietet es sich an, den Parameter --getopenfilename zu verwenden. Er liefert einen absoluten Pfad zurück, etwa /home/user/song.mp3. Der sehr ähnliche Parameter --getopenurl liefert als Ergebnis eine URL zurück, etwa file:/home/user/song.mp3. Mit ihm lassen sich zum Beispiel auch FTP-Adressen aufrufen. Diesen Unterschied finden Sie auch bei den Parametern --getsavefilename und --getsaveurl.

Um nur bestimmte Dateitypen zu öffnen – etwa Musikdateien im MP3-Format – ergänzen Sie den Befehl entsprechend (Listing 5, Zeile 2). Durch den Eintrag MP3-Dateien zeigt KDialog das Wort nun als Filter an (Abbildung 5); löschen Sie die Pipe und den Eintrag, erscheint dort die konkrete Dateiendung.

Abbildung 5: Wollen Sie mit Ihrem Skript nur Audiodateien verarbeiten, sollten Sie dem Benutzer des Skripts auch nur solche zur Auswahl stellen.

Abbildung 5: Wollen Sie mit Ihrem Skript nur Audiodateien verarbeiten, sollten Sie dem Benutzer des Skripts auch nur solche zur Auswahl stellen.

Gewöhnlich geben Sie nach --getopenfilename einen Pfad ein, den das Dialogfenster öffnet – im gerade gezeigten Beispiel war es das gegenwärtige Verzeichnis. Ersetzen Sie den Eintrag durch :label1, startet der Dateimanager dort, wo Sie ihn zuletzt verlassen haben, merkt sich also das zuletzt benutzte Verzeichnis.

Listing 5
kdialog --passivepopup "Das war nun wirklich nicht nötig…" 5
kdialog --getopenfilename . " *.mp3 | MP3-Dateien"

Fazit

Schreiben Sie Skripte für andere Benutzer, geben die Dialogfelder ein hilfreiches visuelles Feedback – gerade für Einsteiger. Allerdings ertappt man sich mitunter selbst dabei, wie man funktionierende Skripte umschreibt und möchte bald nicht mehr auf den Komfort des visuellen Feedbacks verzichten.

Zenity

Typ Dialog
--calendar
--entry
--error
--file-selection
--info
--list
--notification
--progress
--question
--text-info
--warning
--scale

KDialog

Typ Dialog
--msgbox
--inputbox
--textbox
--passivepopup
--sorry
--error
--yesno
--yesnocancel
--warningyesno
--warningyesnocancel
--warningcontinuecancel
--menu
--checklist
--radiolist
--combobox
@TL:--getopenfilename
--getsavefilename
--getexistingdirectory
--progressbar
LinuxUser 06/2008 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

1 Kommentar
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
someone
17 Jahre her

Wäre gut, wenn beide programme die selben parameter hätten,
oder einen Kompatibilitäts-schalter. Warum können gnome u. kde Entwickler nicht ein bisschen zusammenarbeiten, anstatt immer Extrawürste zu braten ?

Will nicht rummeckern, aber das wäre sicher leicht machbar und vor allem SINNVOLL, ausserdem nicht mit viel mehr Arbeit verbunden gewesen.

Nach oben