Website-Suche

So verwenden Sie ncurses-Widgets in Shell-Skripten unter Linux


In diesem Tutorial lernen wir die Grundlagen des Dialogprogramms kennen, um das Widget ncurses in unseren Shell-Skripten zu verwenden. Wir werden sehen, wie man Dialog in den am häufigsten verwendeten Linux-Distributionen installiert, einige der allgemeinen Optionen, die wir verwenden können, um das Verhalten von Dialog zu ändern, wie man einige Widgets verwendet; Unter anderem: Eingabebox, Checkliste, Radiolist und Yesno. Schließlich werden wir sehen, wie die durch die Widget-Verarbeitung erhaltenen Daten verwendet werden.

In diesem Tutorial lernen Sie:

  • So installieren Sie das Dialogprogramm unter Linux
  • Was sind die wichtigsten Dialogoptionen?
  • So verwenden Sie die Widgets inputbox, checklist, radiolist, passwordbox, msbox, calendar und yesno
  • Verwalten von Daten, die aus der Widget-Verarbeitung abgeleitet werden
sudo dnf install dialog

Unter Debian können wir ausführen:

sudo apt-get install dialog

Das Dialogprogramm ist auch im Archlinux-Core-Repository enthalten, so dass wir es über pacman installieren können:

sudo pacman -S dialog

Das Installieren von Befehlen gilt auch für Ableitungen der oben genannten Distributionen.

Allgemeine Dialogoptionen

Wir nennen diese Optionen "allgemein", da sie unabhängig von der Art des Widgets verwendet werden können, das wir verwenden möchten. Hier sehen wir nur einige von ihnen, die von unmittelbarem Interesse sein könnten, wenn wir mit der Verwendung von Dialog beginnen.

Festlegen eines Widget-Box-Titels: die Option –title

Mit der Option --title können wir einen String angeben, der als Widget-Titel verwendet wird; Es wird oben in der Box angezeigt. Hier ist ein Beispiel:

dialog --title "Dialog title" --inputbox "Enter your name:" 0 0

Folgendes wird als Ergebnis des obigen Befehls angezeigt:

Die Option --and-widget kann verwendet werden, um weitere Widgets zu "verketten", so dass wir, nachdem wir das erste verwendet haben, sofort mit dem zweiten aufgefordert werden. Die Kette wird gestoppt, wenn eines der Dialogfelder den Status "Vorhanden" ungleich Null zurückgibt. Ein Beispiel für seine Verwendung ist:

dialog \
  --inputbox "Enter your name:" 0 0 \
  --and-widget --inputbox "Enter your age:" 0 0

Sobald wir den obigen Befehl starten, wird das erste Eingabe-Widget angezeigt, mit dem wir zur Eingabe unseres Namens aufgefordert werden. Sobald wir die Eingabe mit einem Klick auf die Schaltfläche OK bestätigen, wird das nächste Widget angezeigt und wir werden aufgefordert, unser Alter einzugeben.

Löschen des Bildschirms mit der Option –clear

Wenn wir die Option --and-widget verwenden, überschreibt der Inhalt, der von einem Widget erstellt wurde, den vom vorherigen Widget erzeugten. Wenn die Widgets nicht genau den gleichen Bildschirmplatz einnehmen, würden die beiden Inhalte vermischt, und dies würde zu einem Durcheinander führen.

Um eine Überlappung des Inhalts zu vermeiden, können wir die Option --clear verwenden. Wenn wir dies tun, wird der Inhalt eines Widgets gelöscht, bevor das nächste Widget angezeigt wird: Nur die Hintergrundfarbe wird beibehalten.

Festlegen der Schaltfläche a als standardmäßig hervorgehoben: die Option –default-button

Abhängig von dem Widget, das wir verwenden, können mehr als eine Schaltfläche auf dem Bildschirm angezeigt werden, und standardmäßig ist eine davon standardmäßig hervorgehoben, wodurch die Standardaktion bestimmt wird, die ausgeführt werden soll, wenn der Benutzer die Eingabetaste drückt.

Wir können die Standardeinstellung des Widgets
überschreiben, indem wir die Option --default-button gefolgt vom Namen der Schaltfläche verwenden, entweder in Ordnung, Ja, Abbrechen, Nein, Hilfe oder Extra.

Diese Option kann z.B. sehr nützlich sein, wenn Sie vor dem Ausführen einer potentiell
gefährlichen Aktion zur Bestätigung auffordern:

dialog --default-button "no" --inputbox "Enter your name:" 0 0

Festlegen des standardmäßig ausgewählten Elements in einer Liste mit –default-item

Wenn wir eine Checkliste oder ein Menü-Widget verwenden, wird standardmäßig das erste Element in der Liste der möglichen Auswahlmöglichkeiten ausgewählt. Indem wir die Option --default-item verwenden und auf ein Element verweisen, können wir es als alternative Standardeinstellung verwenden:

dialog --default-item 2 --checklist "Select:" 0 0 5 \
  1 "First element" off \
  2 "Second element" off \
  3 "Third element" off

Festlegen einer Zeitverzögerung nach der Bestätigung: die Option –sleep

Manchmal möchten wir möglicherweise, dass unsere Anwendung nach der Verarbeitung eines Dialogfelds eine bestimmte Anzahl von Sekunden wartet. Um dieses Verhalten zu erreichen, können wir die Option --sleep verwenden und die Anzahl der Sekunden, die gewartet werden soll, als Wert angeben:

dialog --sleep 3 --inputbox "Enter your name:" 0 0

Als Ergebnis des obigen Befehls wird nach der Anzeige des Eingabefeld-Widgets und dem Drücken der ENTER-Taste durch den Benutzer 3 Sekunden gewartet, bevor der nächste Befehl im aufrufenden Skript ausgeführt wird.

Bereitstellen einer Zeitüberschreitung für die Auswahl

In einigen Fällen möchten wir dem Benutzer möglicherweise eine maximale Anzahl von Sekunden geben, um seine Auswahl auszuführen. Die Dialoganwendung stellt die Option --timeout bereit, um dieses Verhalten zu erhalten. Die Anzahl der Timeout-Sekunden muss als Argument der Option übergeben werden. Wenn der Benutzer nach der angegebenen Anzahl von Sekunden seine Auswahl nicht ausführt, wird die Anwendung mit einem Fehlerstatus beendet:

dialog --timeout 3 --inputbox "Enter your name:" 0 0

Festlegen alternativer Beschriftungen für Schaltflächen

Das Dialogprogramm bietet eine Reihe von Optionen, um die Standardbeschriftung für Schaltflächen zu überschreiben: Wir können die Tasten --exit-label, --extra-label, --help-label, --no-label, --ok-label, --yes-label verwenden, um die Beschriftungen der Schaltflächen "exit", "extra", "help", "no", "ok" und "yes" zu ändern.

Jede der oben genannten Optionen nimmt eine Zeichenfolge als Argument an, die als Schaltflächenbeschriftung verwendet wird. Hier ist ein Beispiel für die Verwendung der Option:

dialog --default-button "no" \
  --no-label "I don't" \
  --yes-label "I do" \
  --yesno "Do you really want to format the partition?" 0 0

Der obige Befehl führt zu folgendem Ergebnis:

  1. Der Text, der im Widget angezeigt werden soll;
  2. Die Breite des Widgets;
  3. Die Höhe des Widgets;

Wenn wir für Breite oder Höhe einen Wert von 0 angeben, wird der Wert des entsprechenden Attributs automatisch gesetzt.

Das Eingabefeld-Widget

Das Eingabefeld-Widget wird verwendet, um den Benutzer aufzufordern, auf eine Frage mit einer Texteingabe zu antworten. Der text-Parameter wird verwendet, um die Frage zu stellen: Wenn die Zeichenfolge länger als das Dialogfeld ist, wird letzteres scrollbar. Um dieses Widget zu verwenden, rufen wir den Dialog mit der Option --inputbox auf:

Das Checklisten-Widget

Wir haben bereits in früheren Beispielen gesehen, wie das Checklisten-Widget aussieht: In dieser Art von Widget wird dem Benutzer eine Reihe von Auswahlmöglichkeiten zur Verfügung gestellt, die er auswählen kann, um eine oder mehrere davon auszuwählen. Um dieses Widget zu verwenden, müssen wir die Option --checklist verwenden, und zusätzlich zu den standardmäßigen drei Parametern, die an alle Widgets übergeben werden müssen, müssen wir auch die Listenhöhe und die anzuzeigenden Auswahlmöglichkeiten angeben.

Mit dem Parameter line-height wird festgelegt, wie viele Zeilen gleichzeitig angezeigt werden sollen: Wenn die Anzahl der Zeilen kleiner ist als die verfügbaren Optionen, wird das Menü scrollbar. Wenn wir 0 als Wert für die Zeilenhöhe angeben, entspricht die Anzahl der Zeilen der Anzahl der Auswahlmöglichkeiten.

Für jede Auswahl müssen wir eine Kennung (Tag), einen Namen und einen Status angeben, der aus oder an sein kann. Wenn der Status "Ein" lautet, wird die Option standardmäßig aktiviert. Sobald wir unsere Auswahl bestätigt haben, werden die Tags, die sich auf den von uns überprüften Eintrag beziehen, auf stderr angezeigt:

dialog --checklist "Select items:" 0 0 0 \
  1 "Choice number one" off \
  2 "Choice number two" on \
  3 "Choice number three" off \
  4 "Choice number four" on

Mit dem obigen Befehl haben wir das Menü mit 4 Optionen gestartet und die Optionen 2 und 4 standardmäßig aktiviert. Die Ausgabe des Befehls lautet wie folgt:

Das Radiolist-Widget wird gestartet, wenn das Dialogfeld mit der Option --radiolist aufgerufen wird. Es funktioniert ähnlich wie das Checklisten-Widget, mit dem Unterschied, dass sich die Auswahlmöglichkeiten gegenseitig ausschließen, sodass nur ein Element ausgewählt werden kann. So verwenden wir das Widget:

dialog --radiolist "Select items:" 0 0 0 \
  1 "Choice number one" Off \
  2 "Choice number two" on \
  3 "Choice number three" off \
  4 "Choice number four" Off

Bitten Sie den Benutzer über das passwordbox-Widget um ein Passwort

Das passwordbox-Widget wird verwendet, um einen Benutzer zur Eingabe eines Passworts aufzufordern. Aus Sicherheitsgründen wird der vom Benutzer eingegebene Text nicht angezeigt. Dieses Verhalten kann mit der Option --insecure geändert werden: Wenn wir dies tun, zeigt das Widget ein Sternchen für jeden Buchstaben des Passworts an, der in das entsprechende Feld eingegeben wird.

Wir verwenden das Widget, indem wir den Dialog mit der Option --passwordbox starten:

dialog --insecure --passwordbox "Enter your password:" 0 0

Die Ausgabe des obigen Befehls lautet:

Die Verwendung dieses Widgets ist sehr einfach: Es wird durch den Aufruf von dialog mit der Option --msgbox aufgerufen und zeigt eine Nachricht an, die den Inhalt des Textparameters darstellt. Eine einzelne Schaltfläche OK wird angezeigt:

dialog --msgbox "This is a very important message that should be read carefully!" 0 0

Wir können das Kalender-Widget verwenden, indem wir das Dialogprogramm mit der Option --calendar aufrufen. Mit dem Widget können wir ein Datum auswählen, indem wir Monat, Tag und Jahr auswählen, die in separaten Abschnitten des Widgets angezeigt werden. Es ist möglich, ein Standarddatum anzugeben, indem Sie es als Teil des Befehls übergeben.

Um das Widget beispielsweise mit dem "fünften Maitag des Jahres 2020" als Standarddatum zu starten, würden wir den folgenden Befehl ausführen:

dialog --calendar "Select a date:" 0 0 27 05 2020

Es wird die folgende Ausgabe erzeugt:

dialog --date-format %Y/%m/%d --calendar "Select a date" 0 0 27 05 2020

Fordern Sie den Benutzer zur Bestätigung auf: das yesno-Widget

Wir sind bereits auf dieses Widget gestoßen: Es ermöglicht uns, den Benutzer zur Bestätigung aufzufordern. Bei der Verwendung geben wir die Frage an, die über den Textparameter gestellt werden soll. Abhängig von der Benutzerwahl wird ein Exit-Status zurückgegeben: 0, wenn der Benutzer mit einem Klick auf die Schaltfläche Ja bestätigt, ansonsten 1.

Um dieses Widget aufzurufen, müssen wir die Option --yesno verwenden:

dialog --yesno "Do you confirm?" 0 0

Hier ist das Widget:

dialog --checklist "Select items:" 0 0 0 \
  1 "Choice number one" off \
  2 "Choice number two" on \
  3 "Choice number three" off \
  4 "Choice number four" on 2> choice.txt

Sobald der Benutzer seine Auswahl bestätigt hat, werden sie durch Leerzeichen getrennt in die choice.txt Datei geschrieben.

Was ist, wenn wir die Auswahl direkt in einer Variablen speichern möchten? Um die Aufgabe zu erledigen, müssen wir die Option --stdout verwenden, damit die Ausgabe des Widgets auf stdin statt auf stderr angezeigt wird:

choices="$(dialog --stdout --checklist "Select items:" 0 0 0 \
  1 "Choice number one" off \
  2 "Choice number two" on \
  3 "Choice number three" off \
  4 "Choice number four" on)"

Im obigen Beispiel ist das Ergebnis der Widget-Verarbeitung über die Variable choices zugänglich. Vielleicht möchten wir sie noch einmal durchgehen:

for choice in ${choices}; do echo "${choice}"; done
2
4

Um den Prozess des Yesno-Widgets zu verwalten, müssen wir uns anders verhalten. Dieses Widget erzeugt, wie wir bereits gesehen haben, keine Ausgabe, sondern ändert den Exit-Code des Befehls, mit dem es angezeigt wird, entsprechend der Wahl des Benutzers. Wenn der Benutzer die Frage bestätigt und bejaht, wird der Exit-Code auf 0 gesetzt, andernfalls auf 1 (dies mag seltsam erscheinen, aber denken Sie daran, dass 0 OK bedeutet, während 1 ein Exit-Status ist, der bedeutet, dass ein Befehl nicht erfolgreich war). Wenn wir das wissen, können wir etwas schreiben wie:

if dialog --yesno "Do you want to open an instance of gnome-terminal ?" 0 0; then
  clear
  gnome-terminal
fi

Schlüsse

In diesem Tutorial haben wir gesehen, wie wir die Dialoganwendung verwenden können, um das Widget ncurses in Shell-Skripten zu verwenden. Zuerst sahen wir einige gängige Optionen, die unabhängig vom Widget-Typ verwendet werden können, dann haben wir uns einige Widgets speziell angesehen. Es gibt noch viele weitere Widgets, die mit Dialog verwendet werden können: Für eine vollständige Liste empfehle ich Ihnen, einen Blick in das Anwendungshandbuch zu werfen.

Verwandte Artikel: