„Grafische“ Terminal Menüs mit Whiptail

Auch wenn es in Terminals in aller Regel recht Textlastig zugeht, lassen sich dort mit einfachen Bordmitteln auch kleine Menüs erstellen, die einen Hauch von grafischer Oberfläche bieten. Das Programm der Wahl hierfür heisst ‚whiptail‘, mt dem sich relativ simpel Dialogboxen erstellen lassen. Und um den Grafikfetischisten nun noch schweißnasse Träume zu bereiten, lassen sich zu allem Überfluss damit auch noch Eingabefelder, Ja/Nein-Abfragen, eine Menü-Aswahl und Checklist-Boxen erzeugen.

Whiptail sollte von Haus aus in jeder Handelsüblichen Linux Installation mit an Bord sein. Ist dies nicht der Fall, kann mit folgendem Befehl nachträglich die Grundlage dafür geschaffen werden:

sudo apt install whiptail

Zu Beginn erstellen wir uns im folgendem ein Menü, welches uns erstmal mit einem Willkommensbildschirm begrüßt:

whiptail --title "Willkommensbildschirm" --msgbox "Unser erstes whiptail Fenster" 10 50

Dieser Befehl erzeugt ein Fenster mit dem Titel (–title) „Willkommensbildschirm“, dem Textkörper (–msgbox) „Unser erstes whiptail Fenster“ in einer Höhe von 10 Pixeln und einer Breite von 50 Pixeln. Mit Enter oder Space lässt sich das Fenster wieder schließen.
Die weitere Variante von Eingabefenstern in whiptail rufen wir hiermit auf:

whiptail --title "Eingabefenster" --inputbox "Erwarte Eingabe" 10 50

Die Parameter haben sich, ähnlich dem vorherigen Aufruf, nicht großartig geändert. Es musste lediglich der Parameter ‚–msgbox‘ für ‚–inputbox‘ weichen.
Eine Eingabe ohne den Wert festzuhalten bringt auf lange Sicht nicht viel Freude. Außerdem möchten wir ja ein zusammenhängendes Menü erzeugen. Aus diesem Grund verfrachten wir unsere beiden Eingaben in ein Shell-Skript und lassen den Wert des Eingabefensters in eine Variable schreiben.
Wir erzeugen uns also eine neue Datei:

touch ./whiptail.sh

und befüllen diese mit Inhalt:

Inhalt der Datei ./whiptail.sh …

#!/bin/bash

whiptail --title "Willkommensbildschirm" --msgbox "Unser erstes whiptail Fenster" 10 50
whiptail_eingabe=$(whiptail --title "Eingabefenster" --inputbox "Erwarte Eingabe" 10 50 3>&1 1>&2 2>&3)

Was wir hier nun tun ist die Übergabe des Wertes der whiptail inputbox Funktionsanweisung in die Variable ‚whiptail_eingabe‘. Diese Variable wäre nun innerhalb des whiptail.sh-Skriptes nutzbar.
Außerdem sieht man an diesem Beispiel wunderbar, dass ein whiptail Menü nichts anderes ist, als mehrere aneinandergereihte whiptail-Fenster.
Neben der gewöhnlichen inputbox Funktion, die den eingegebenen Text in Klartext anzeigt, gibt es noch die sogenannte ‚passwordbox‘.

whiptail_eingabe_passwort=$(whiptail --title "Eingabefenster Passwort" --passwordbox "Erwarte Passworteingabe" 10 50 3>&1 1>&2 2>&3)

Das Ergebnis ist dasselbe Eingabefenster wie zuvor, lediglich der angezeigte Text wird als *** angezeigt.
Die nächste Funktion ist die ‚radiolist‘.

whiptail_radio=$(whiptail --title "Radio-Liste" --radiolist \
"Wähle eine Ebene" 15 60 5 \
"Asgard" "Heimat des Göttergeschlechts der Asen" ON \
"Midgard" "Heimat der Menschen" OFF 3>&1 1>&2 2>&3)

Wie von einer Radio-Liste gewohnt haben wir die Möglichkeit, einen einzelnen vordefinierten Wert auszuwählen. Neben dem Fenstertitel und einer Überschrift innerhalb der Radio-Liste Textbox, gibt es nun 3 Parameter um die Fenstergröße zu steuern. Die ersten beiden Werte sind wie gehabt für Höhe und Breite zuständig. Der dritte Wert legt die Höhe der Radio-Liste innerhalb des Fensters fest.
Die eigentlichen Auswahlwerte sind in „“-gesetzt. Pro Zeile sind jeweils 2 Einträge erforderlich. Der linke der beiden dient der Variablenzuweisung nach ‚whiptail_radio‘, der rechte dient lediglich als Beschreibung. Ausgewählt werden sie mit Hilfe der Leertaste. Der Schalter ON und OFF legt fest, welcher Wert Vorausgewählt ist.

Ähnlich wie die ‚radiolist‘ geht es nun zur ‚checklist‘.

whiptail_checkliste=$(whiptail --title "Check-Liste" --checklist \
"Welche Göttertt dürfen's denn sein?" 15 60 5 \
"Odin" "Der Göttervater" ON \
"Thor" "Der Gewittergott" OFF \
"Freya" "Die Fruchtbarkeitsgöttin" OFF 3>&1 1>&2 2>&3)

Das Prinzip ist dasselbe wie in der Radio-Liste, nur lassen sich hier mehrere oder auch keine Werte festlegen. Das war’s auch schon mit den Unterschiedlichkeiten.
Auch ein Menü lässt sich erstellen und zwar mit der Funktion ‚menu‘.

whiptail_menu=$(whiptail --title "Menü" --menu "Wähle deine Saga" 25 78 16 \
"Beowulf" "König der Gauten." \
"Ragnar" "Held der Wikinger." \
"Lagertha" "Schildmaid." \
"Harald" "König von Norwegen." 3>&1 1>&2 2>&3)

Dieses Menü verhält sich ebenfalls wie die Radio-Liste, mit der Ausnahme, dass bei gedrückter Enter oder Leertaste, die Auswahl direkt akzeptiert wird.
Als letztes schauen wir uns das Ja/Nein-Auswahlfenster an.

whiptail_yesno=$(whiptail --title "Ja/Nein-Abfrage" --yesno "Sind diese getroffenen Eingaben korrekt?\n
Eingabe: $whiptail_eingabe
Ebene: $whiptail_radio
Götter: $whiptail_checkliste
Saga: $whiptail_menu" 15 50 3>&1 1>&2 2>&3)

Neben der Ja/Nein-Abfrage habe ich diesem Fenster sämtliche zuvor getroffenen Eingaben übergeben, sodass sie angezeigt werden können. Diese Ja/Nein-Schalter lassen sich sogar noch umbenennen indem wir nach dem Textkörper die Parameter ‚–no-button <WERT>‘ und ‚–yes-button <WERT>‘ ergänzen.
Da whiptail nun allerdings nicht weiß, wie es mit der Auswahl von Ja oder Nein (oder wie auch immer wir unsere Auswahlmöglichkeit benannt haben) zu verfahren hat, müssen wir noch eine if/else Abfrage dazwischenschalten:

if whiptail_yesno=$(whiptail --title "Ja/Nein-Abfrage" --yesno "Sind diese getroffenen Eingaben korrekt?\n
Eingabe: $whiptail_eingabe
Ebene: $whiptail_radio
Götter: $whiptail_checkliste
Saga: $whiptail_menu" --no-button "Nochmal von vorne" --yes-button "Whiptail beenden" 15 70 3>&1 1>&2 2>&3); then
  echo "Auswahl Ja"
else
  echo "Ausahl Nein"
fi

Als Ergebnis bekommen wir in diesem Beispiel je nach Auswahl „Auswahl Ja“ oder „Auswahl Nein“ in der Konsole angezeigt. Um die Auswahl auf dieser Frage ein wenig mehr Funktionalität zu verleihen, können wir sie beispielsweise auch zur Steuerung einer while-Schleife verwenden, die alle zuvor erstellten whiptail-Fenster umfasst, sodass bei Betätigung von ‚Nein‘ die Eingabe von vorne beginnt und bei Betätigung von ‚Ja‘ die Schleife aufgelöst wird.
Folgendermaßen könnte das Endergebnis dann aussehen:

#!/bin/bash

while true;
do

whiptail --title "Willkommensbildschirm" --msgbox "Unser erstes whiptail Fenster" 10 50

whiptail_eingabe=$(whiptail --title "Eingabefenster" --inputbox "Erwarte Eingabe" 10 50 3>&1 1>&2 2>&3)

whiptail_eingabe_passwort=$(whiptail --title "Eingabefenster Passwort" --passwordbox "Erwarte Passworteingabe" 10 50 3>&1 1>&2 2>&3)

whiptail_radio=$(whiptail --title "Radio-Liste" --radiolist \
"Wähle eine Ebene" 15 60 5 \
"Asgard" "Heimat des Göttergeschlechts der Asen" ON \
"Midgard" "Heimat der Menschen" OFF 3>&1 1>&2 2>&3)

whiptail_checkliste=$(whiptail --title "Check-Liste" --checklist \
"Welche Götter dürfen's denn sein?" 15 60 5 \
"Odin" "Der Göttervater" ON \
"Thor" "Der Gewittergott" OFF \
"Freya" "Die Fruchtbarkeitsgöttin" OFF 3>&1 1>&2 2>&3)

whiptail_menu=$(whiptail --title "Menü" --menu "Wähle deine Saga" 15 60 5 \
"Beowulf" "König der Gauten." \
"Ragnar" "Held der Wikinger." \
"Lagertha" "Schildmaid." \
"Harald" "König von Norwegen." 3>&1 1>&2 2>&3)

if whiptail_yesno=$(whiptail --title "Ja/Nein-Abfrage" --yesno "Sind diese getroffenen Eingaben korrekt?\n
Eingabe: $whiptail_eingabe
Ebene: $whiptail_radio
Götter: $whiptail_checkliste
Saga: $whiptail_menu" --no-button "Nochmal von vorne" --yes-button "Whiptail beenden" 15 70 3>&1 1>&2 2>&3); then

break

fi

done

Und hier das Endergebnis:

Achso, falls wir mit der Farbgebung unzufrieden sind, lässt sich diese über Variablen steuern.

export NEWT_COLORS=‘
root=,green
window=,black
border=white,black
textbox=white,black
button=black,white
entry=,black
checkbox=,black
compactbutton=,green

Diese Werte fügt ihr ganz oben im Skript ein. Unsere whiptail Anwendung wird dann in etwa so aussehen:

In einem Forenbeitrag von https://askubuntu.com/ habe ich eine Auflistung aller farblichen Möglichkeiten gefunden, die im folgenden aufgelistet wird:

root                  root fg, bg
border                border fg, bg
window                window fg, bg
shadow                shadow fg, bg
title                 title fg, bg
button                button fg, bg
actbutton             active button fg, bg
checkbox              checkbox fg, bg
actcheckbox           active checkbox fg, bg
entry                 entry box fg, bg
label                 label fg, bg
listbox               listbox fg, bg
actlistbox            active listbox fg, bg
textbox               textbox fg, bg
acttextbox            active textbox fg, bg
helpline              help line
roottext              root text
emptyscale            scale full
fullscale             scale empty
disentry              disabled entry fg, bg
compactbutton         compact button fg, bg
actsellistbox         active & sel listbox
sellistbox            selected listbox
color0  or black
color1  or red
color2  or green
color3  or brown
color4  or blue
color5  or magenta
color6  or cyan
color7  or lightgray
color8  or gray
color9  or brightred
color10 or brightgreen
color11 or yellow
color12 or brightblue
color13 or brightmagenta
color14 or brightcyan
color15 or white

Quelle: https://askubuntu.com/questions/776831/whiptail-change-background-color-dynamically-from-magenta

4 Kommentare zu „„Grafische“ Terminal Menüs mit Whiptail“

  1. Jürgen Zetzmann

    Super gemacht nun möchte ich aber einen Befehl/Argument an ein Programm über Geben wie zb Display on od. Off bekomme ich leider nicht hin vieleicht können sie mir helfen.

    Danke

    1. derlinuxwikinger

      Hallo Jürgen,
      entschuldige bitte die recht späte Antwort.
      Du kannst das Programm, an welches du die gesetzten Variablen übergeben möchtest, einfach mit in das Skript aufnehmen. Das kann dann beispielsweise in etwa so aussehen:

      #!/bin/bash
      whiptail_radio=$(whiptail –title „Radio-Liste“ –radiolist \
      „Display ‚on‘ oder ‚off‘?“ 15 60 5 \
      „ON“ „Schaltet den Bildschirm ein“ ON \
      „OFF“ „Schaltet den Bildschirm aus“ OFF 3>&1 1>&2 2>&3)
      echo $whiptail_radio

      In diesem Beispiel wird eine Radio-Liste mit 2 Auswahlmöglichkeiten erzeugt. Je nach getroffener Auswahl, wird die Variable „whiptail_radio“ mit dem entsprechenden Wert befüllt, also entweder „ON“ oder „OFF“. Nachdem das Skript nun also ausgeführt und der Wert innerhalb des Whiptail Fensters gesetzt wurde, kann die Variable problemlos weiterverarbeitet werden. In diesem Fall lasse ich sie einfach nur mit Hilfe des „echo“-Befehls in die Kommandozeile ausgeben.
      Ich hoffe das hilft dir weiter.

      viele Grüße

  2. So habe ich es hinbekommen und danke für deine Info
    Mfg
    Jürgen

    HD=$(whiptail –title „Display Helligkeit“ –inputbox „Eingabe von 1 – 100“ 10 50 3>&1 1>&2 2>&3)
    sudo sh -c „echo ‚$HD‘ >> /sys/class/backlight/rpi_backlight/brightness“ ;;

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen