„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
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
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
Danke !
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“ ;;