GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So erstellen Sie GUI-Dialogfelder in Bash-Skripten mit Whiptail in Linux

Vor einiger Zeit haben wir kurz über Zenity gesprochen , ein einfaches Programm, mit dem Sie grafische (GTK+) Dialogfelder in Befehlszeilen- und Shell-Skripten erstellen können. In diesem Artikel werden wir noch ein weiteres GUI-Dienstprogramm namens Whiptail besprechen das verwendet werden kann, um GUI-Dialogfelder in Bash-Skripten unter Linux zu erstellen.

Nicht jedes Skript, das Sie schreiben, benötigt eine grafische Frontend-Oberfläche. Aber manchmal wäre es besser, wenn Sie eine grafische Oberfläche erstellen, anstatt sich auf die Interaktion mit der Befehlszeile zu verlassen. Wenn in meinem Fall eine lange Liste von Antworten im Skript erforderlich ist, würde ich mich für eine grafische Benutzeroberfläche entscheiden.

Whiptail ist ein benutzerfreundliches GUI-Dienstprogramm, das ein newt verwendet Programmierbibliothek. Whiptail bietet verschiedene Dialogfelder für unterschiedliche Zwecke. Abhängig von Ihrem Anwendungsfall können Sie diese Dialogfelder verwenden, um Ihr Skript interaktiver zu gestalten.

Whiptail unter Linux installieren

Whiptail ist bei vielen Distributionen vorinstalliert, aber wenn Ihre Distribution Whiptail nicht installiert hat, befolgen Sie die nachstehenden Anweisungen, um es zu installieren.

Um zu überprüfen, ob Whiptail bereits installiert ist, führen Sie den folgenden Befehl aus.

$ which whiptail

Um Whiptail auf Debian/Ubuntu und seinen abgeleiteten Distributionen zu installieren, führen Sie den folgenden Befehl aus:

$ sudo apt install whiptail -y

Fedora/RHEL/CnetOS/AlmaLinux/Rocky Linux:

$ sudo dnf install newt

Arch Linux, EndeavourOS, Manjaro Linux:

$ sudo pacman -S whiptail

Alpine Linux:

$ apk add newt

Hilfeoption

Sie können --help verwenden Flag, das die Liste der unterstützten Dialogfelder und andere Optionen anzeigt, die Sie verwenden können. Insgesamt werden 10 Dialogfelder mit verschiedenen Funktionen unterstützt, und wir werden sie uns alle in den kommenden Abschnitten ansehen.

$ whiptail -help
Box options: 
    --msgbox <text> <height> <width>
    --yesno  <text> <height> <width>
    --infobox <text> <height> <width>
    --inputbox <text> <height> <width> [init] 
    --passwordbox <text> <height> <width> [init] 
    --textbox <file> <height> <width>
    --menu <text> <height> <width> <listheight> [tag item] ...
    --checklist <text> <height> <width> <listheight> [tag item status]...
    --radiolist <text> <height> <width> <listheight> [tag item status]...
    --gauge <text> <height> <width> <percent>

1. Nachrichtenfeld

Das Nachrichtenfeld zeigt dem Benutzer Nachrichten an und wartet, bis der Benutzer drückt oder Schlüssel. Wenn Sie drücken es wird einen Rückgabecode 0 auslösen und wenn Sie drücken es wird Rückgabecode 255 auslösen .

$ whiptail --title "Welcome Message" --msgbox "Howdy, Welcome to OSTechnix.." 8 78

Lassen Sie uns den obigen Befehl entschlüsseln.

--title  Dadurch wird dem Fenster ein Titel hinzugefügt  
--msgbox   Dies druckt die Nachricht, die Sie innerhalb der Anführungszeichen angeben.
8 78   Hiermit werden Höhe (8) und Breite (78) des Fensters festgelegt.

Sie können ein neues Terminal öffnen und nach dem Whiptail-Prozess suchen. Es befindet sich in einem Schlafzustand. Bedeutung – es wartet darauf, dass Sie drücken oder .

$ ps -ef | grep -i whiptail 
karthick   20023    9251  0 22:41 pts/0    00:00:00 whiptail --title Welcome Message --msgbox Howdy, Welcome to OSTechnix.. 8 78 
karthick   20071   19379  0 22:41 pts/1    00:00:00 grep --color=auto -i whiptail 
$ ps -q 20023 -o state --no-headers 
S 

HINWEIS: Zustand (S ) -> unterbrechbarer Ruhezustand (Warten auf den Abschluss eines Ereignisses).

2. Infobox

Info ähnelt dem Meldungsfeld, aber der Unterschied besteht darin, dass das Meldungsfeld nicht auf die Benutzereingabe wartet. Verwenden Sie –-infobox kennzeichnen und als Argument einen String übergeben, der in der Infobox angezeigt wird.

In einigen Shells wird die Infobox ausgeführt, zeigt aber kein Ergebnis an. Sie müssen die Terminalemulation ändern und ausführen, wie ich es im folgenden Snippet getan habe.

$ TERM=ansi whiptail --title "Welcome Message" --infobox "Howdy, Welcome to OSTechnix.." 8 78 

3. Ja/Nein-Feld

Ja/Nein-Box zeigt ein Dialogfeld mit JA an oder NEIN Option, bei der Sie wählen es wird return ausgelöst Code 0 und wenn Sie drücken es wird Rückgabecode 1 auslösen .

Verwenden Sie --yesno Flag, um zur Auswahl aufzufordern. Führen Sie das folgende Snippet aus, das das Ja/Nein-Feld und das Meldungsfeld kombiniert. Zuerst wird die Ja/Nein-Option angezeigt und abhängig von Ihrer Auswahl wird der Rückgabecode ausgegeben.

Erstellen Sie ein Shell-Skript, kopieren Sie das folgende Snippet und führen Sie es aus.

#!/usr/bin/env bash

whiptail --title "CONFIRMATION" --yesno "Should I proceed" 8 78 
if [[ $? -eq 0 ]]; then 
  whiptail --title "MESSAGE" --msgbox "Process completed successfully." 8 78 
elif [[ $? -eq 1 ]]; then 
  whiptail --title "MESSAGE" --msgbox "Cancelling Process since user pressed <NO>." 8 78 
elif [[ $? -eq 255 ]]; then 
  whiptail --title "MESSAGE" --msgbox "User pressed ESC. Exiting the script" 8 78 
fi 

Wenn Sie keine Ahnung von bedingten Bash-Anweisungen haben, werfen Sie einen Blick auf unseren kurzen Artikel darüber, indem Sie den Link unten verwenden.

  • Bash-Skripting – Bedingte Anweisungen

4. Textfeld

Das Textfeld liest und druckt die Datei. Im folgenden Snippet lese ich die ostechnix.txt Datei. Das Flag –scrolltext ermöglicht es Ihnen, das Mausrad zu verwenden, um vertikal zu scrollen, wenn Sie lange Textseiten haben, die nicht in das aktuelle Fenster passen.

$ whiptail --textbox --scrolltext ostechnix.txt 10 80

5. Weiterleitungen

Die Dialogfelder, die Sie im nächsten Abschnitt sehen werden, erfordern, dass die Ausgabe in einer Variablen gespeichert und später für die Verarbeitung verwendet wird. Der Rückgabewert des Widgets wird an stderr statt an stdout gesendet. Sie müssen also stdout und stderr vertauschen, damit das Ergebnis in der Variablen gespeichert wird.

Sie müssen den folgenden Ausdruck verwenden, um stdout und stderr auszutauschen.

3>&1 1>&2 2>&3

Versuchen wir, den obigen Ausdruck zu verstehen. Sie wissen, dass FD1 die Standardausgabe und FD2 der Standardfehler ist.

  • 3>&1 - Alles, was zu Dateideskriptor 3 umgeleitet wird, wird zu Dateideskriptor 1 umgeleitet.
  • 1>&2 - Alles, was an Dateideskriptor 1 (Stdout) gesendet wird, wird an Dateideskriptor 2 umgeleitet.
  • 2>&3 - Alles, was an Dateideskriptor 2 (stderr) gesendet wird, wird an Dateideskriptor 3 umgeleitet.

Auf diese Weise tauschen wir stdout und stderr aus, damit die Variable den Rückgabewert von Dialogfeldern speichern kann.

6. Passwortfeld

Mithilfe des Kennwortdialogfelds können Sie Kennwörter eingeben, die während der Eingabe nicht als Klartext angezeigt werden. Verwenden Sie --passwordbox um zur Eingabe des Passworts aufzufordern.

$ whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password"

Wenn Sie drücken , wird es den Rückgabecode 0 auslösen und das von Ihnen eingegebene Passwort an die Konsole (stderr) zurückgeben, wenn Sie vom Terminal aus ausführen.

Sie müssen das Passwort in einer Variablen erfassen und es später im Skript verwenden. Wie im Abschnitt Umleitung besprochen, müssen Sie das Ergebnis umleiten.

$ PASSWORD=$(whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password" 8 78 3>&1 1>&2 2>&3)
$ echo "The password entered by the user is $PASSWORD"

7. Eingabefeld

Das Eingabedialogfeld fordert den Benutzer auf, die Eingabe vorzunehmen. Wie beim Passwortdialog werden die von Ihnen gemachten Eingaben an das Terminal ausgegeben, wenn Sie es vom Terminal aus ausführen. Sie müssen die Umleitungen verwenden und den Wert in einer Variablen speichern, die Sie dann später für die Verarbeitung gemäß Ihrer Programmlogik verwenden.

NEW_USER=$(whiptail --title "Create New User" --inputbox "Username to be created" 8 40 3>&1 1>&2 2>&3)

Sie können auch einen Standardeingabetext festlegen. Alles, was Sie tun müssen, ist den Text nach Höhe und Breite hinzuzufügen. Unten ist die Syntax wo anstelle von [init] Sie platzieren den Standardtext.

--inputbox <text> <height> <width> [init]

Beispiel:

whiptail --title "Create New User" --inputbox "Username to be created" 8 40 noname

Lassen Sie uns nun das Eingabefeld, das Passwortfeld, das Ja/Nein-Feld und das Textfeld kombinieren und ein einfaches Benutzererstellungsprogramm schreiben, um zu sehen, wie diese Dialogfelder miteinander gekoppelt werden können.

8. Checklisten-Dialogfeld

Mit der Checkliste können Sie eine Liste mit Optionen erstellen, aus der ein Benutzer auswählen kann.

--checklist <text> <height> <width> <listheight> [tag item status]...

Oben ist die Syntax zum Erstellen eines Checklisten-Dialogfelds. Sie müssen die --checklist verwenden Flag, gefolgt von der Einstellung der Höhe und Breite des Dialogfelds.

Die Option <listheight> gibt an, wie viele Listen Sie erstellen werden. Jede Liste wird mit <status> gekennzeichnet die auf EIN oder AUS gestellt ist. Ein zeigt an, dass die Liste ausgewählt ist, und Aus zeigt an, dass keine Liste ausgewählt ist.

$ whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" ON

Um eine Liste auszuwählen, drücken Sie die Leertaste und verwenden Sie die Aufwärts- und Abwärtspfeile, um sich zwischen den Listen zu bewegen. Wenn Sie fertig sind, drücken Sie die Eingabetaste.

Sie können die Ausgabe in einem Array speichern und später verwenden. Die Tag-Namen („Chrome, pip3, ksnip, virtualbox“) werden basierend auf der Auswahl als Ausgabe an stderr ausgegeben.

SELECTED=($(whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" ON 3>&1 1>&2 2>&3))
$ echo ${SELECTED[@]} # Array of values

Beispielausgabe:

"pip3" "ksnip" "virtualbox"

Wenn Sie keine Ahnung von Bash-Arrays haben, haben wir einen ausführlichen Artikel über Bash-Arrays. Ich schlage vor, Sie werfen einen Blick auf den unten stehenden Link.

  • Bash-Skripting – Indiziertes Array mit Beispielen erklärt

9. Dialogfeld Radioliste

Das Optionslisten-Dialogfeld ähnelt dem Checklisten-Dialogfeld, der einzige Unterschied besteht darin, dass Sie nur eine Option aus der Liste auswählen können. Syntaktisch sind Radioliste und Checkliste gleich.

--radiolist <text> <height> <width> <listheight> [tag item status]...

Beispiel:

SELECTED=$(whiptail --title "Choose Only One Package" --radiolist \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" OFF 3>&1 1>&2 2>&3)
$ echo $SELECTED
virtualbox

10. Menüdialogfeld

Das Dialogfeld „Menü“ ähnelt dem Dialogfeld „Optionsschaltflächen“. Der einzige Unterschied, den ich fühle, ist, dass Sie im Optionsfeld-Dialogfeld die drücken müssen, um ein Element aus der Liste auszuwählen, und dann die Eingabetaste drücken. Aber im Menü-Dialogfeld müssen Sie nur die Eingabetaste drücken, was den Tag-Namen zu stderr.

zurückgibt

Die Syntax ist ähnlich wie bei der Checkliste und dem Optionsfeld, aber der einzige Unterschied besteht darin, dass die Option "Status" im Menüdialogfeld nicht auf EIN/AUS gesetzt werden muss.

--menu <text> <height> <width> <listheight> [tag item]

Beispiel:

TO_RUN=$(whiptail --title "Menu example" --menu "Choose an option" 25 78 5 \
"backup" "Start taking defined backup" \
"restore" "restore from last backup" \
"Schedule" "Display active backup schedules" 3>&1 1>&2 2>&3)
$ echo $TO_RUN 
backup

11. Fortschrittsbalken

Um einen Fortschrittsbalken zu erstellen, müssen Sie die folgende Syntax verwenden. Zuerst übergeben Sie einen Text, der gedruckt wird, wenn der Fortschrittsbalken läuft, und legen die Höhe und Breite des Fensters fest, gefolgt von dem Prozentsatz des Fortschritts.

--gauge <text> <height> <width> <percent>

Der Fortschrittsprozentsatz wird von unserer Logik gesteuert. Schauen Sie sich den folgenden Ausschnitt an. Ich leite die While-Schleife zum Fortschrittsbalken um und inkrementiere die COUNTER-Variable in 10-Schritten, die als Prozentsatz des Fortschritts verwendet werden.

#!/usr/bin/env bash

COUNTER=0
while [[ ${COUNTER} -le 100 ]]; do
  sleep 1
  COUNTER=$(($COUNTER+10))
  echo ${COUNTER} 
done | whiptail --gauge "Running Data Loader" 6 50 ${COUNTER}

Der Fortschrittsbalken wird in Zehnerschritten erhöht.

Schlussfolgerung

Wir sind am Ende dieses Artikels angelangt. Hier haben wir kurz gesehen, wie man mit Whiptail verschiedene Dialogfelder in Bash-Skripten erstellt. Wenn Sie bereits Whiptail verwendet haben und einen Trick unter dem Sklaven haben, teilen Sie ihn uns über das Kommentarfeld mit.


Linux
  1. So erstellen Sie Threads in Linux (mit einem C-Beispielprogramm)

  2. So erstellen Sie ein ZFS-Dateisystem mit Dateikomprimierung unter Linux

  3. Wie erstelle ich eine Datei mit einer bestimmten Größe in Linux?

  4. So erstellen Sie eine CPU-Spitze mit einem Bash-Befehl

  5. Wie erstellt man ein Fenster in Linux mit C++?

So analysieren Sie CSV-Dateien in Bash-Skripten unter Linux

So erstellen Sie eine Volumengruppe in Linux mit LVM

Wie man Whiptail verwendet, um benutzerfreundlichere interaktive Skripte zu erstellen

So erstellen Sie Dokumente mit Bash-Skripten

So verwenden Sie den Echo-Befehl in Bash-Skripten unter Linux

So arbeiten Sie mit Case-Anweisungen in Bash-Skripten