Créer des boîtes de dialogue GUI dans des scripts Bash avec Whiptail
Il y a quelque temps, nous avons brièvement discuté de Zenity, un programme simple qui vous permet de créer des boîtes de dialogue graphiques (GTK+) dans des scripts de ligne de commande et shell. Dans cet article, nous allons aborder encore un autre utilitaire GUI appelé Whiptail qui peut être utilisé pour créer des boîtes de dialogue GUI dans des scripts Bash sous Linux.
Tous les scripts que vous écrivez n'ont pas besoin d'une interface graphique frontale. Mais parfois, il serait préférable de créer une interface graphique au lieu de compter sur l'interaction avec la ligne de commande. Dans mon cas, s'il y a une longue liste de réponses nécessaires dans le script, je choisirais d'opter pour une interface graphique.
Whiptail est un utilitaire graphique convivial qui utilise un < bibliothèque de programmation span style="text-decoration: underline;">newt. Whiptail propose différentes boîtes de dialogue à des fins différentes. En fonction de votre cas d'utilisation, vous pouvez utiliser ces boîtes de dialogue pour rendre votre script plus interactif.
Installer Whiptail sous Linux
Whiptail est préinstallé avec de nombreuses distributions, mais si votre distribution n'a pas de whiptail installé, suivez les instructions ci-dessous pour l'installer.
Pour vérifier si Whiptail est déjà installé, exécutez la commande suivante.
which whiptail
Pour installer Whiptail sur Debian/Ubuntu et ses distributions dérivées, exécutez la commande suivante :
sudo apt install whiptail -yFedora/RHEL/CnetOS/AlmaLinux/Rocky Linux :
sudo dnf install newtArch Linux, EndeavourOS, Manjaro Linux :
sudo pacman -S whiptailLinux alpin :
apk add newtOption d'aide
Vous pouvez utiliser l'indicateur --help qui affichera la liste des boîtes de dialogue prises en charge et d'autres options que vous pouvez utiliser. Au total, il existe 10 boîtes de dialogue prises en charge avec diverses fonctionnalités et nous les examinerons toutes dans les sections suivantes.
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. Boîte de messages
La boîte de message affichera des messages à l'utilisateur et attendra que l'utilisateur appuie sur la touche
whiptail --title "Welcome Message" --msgbox "Howdy, Welcome to OSTechnix.." 8 78Messagerie
Décodeons la commande ci-dessus.
- --title
Cela ajoutera un titre à la fenêtre
- --msgbox
-
Cela imprimera le message que vous fournissez entre les guillemets.
- 8 78
Ceci définit la hauteur (8) et la largeur (78) de la fenêtre.
Vous pouvez ouvrir un nouveau terminal et vérifier le processus whiptail. Il sera en état de sommeil. Signification : il attend que vous appuyiez sur
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 REMARQUE : État (S) -> veille interrompue (en attente de la fin d'un événement).
2. Boîte d'informations
Les informations sont similaires à la boîte de message, mais la différence est que la boîte d'informations de la boîte de message n'attendra pas la saisie de l'utilisateur. Utilisez l'indicateur --infobox et transmettez une chaîne comme argument qui sera affiché dans la zone d'information.
Dans certains shells, la boîte d'informations s'exécutera mais n'affichera aucun résultat. Vous devez modifier l'émulation du terminal et l'exécuter comme je l'ai fait dans l'extrait ci-dessous.
TERM=ansi whiptail --title "Welcome Message" --infobox "Howdy, Welcome to OSTechnix.." 8 78 Boîte d'info
3. Case Oui/Non
La boîte Oui/Non affichera une boîte de dialogue avec l'option OUI ou NON où, si vous choisissez
Utilisez l'indicateur --oui pour demander le choix. Exécutez l'extrait suivant qui combine la zone oui/non et la zone de message. Au début, il affichera l'option Oui/Non et, selon votre choix, il affichera le code de retour.
Créez un script shell, copiez l'extrait ci-dessous et exécutez-le.
#!/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 Boîte de dialogue Oui/Non
Si vous n'avez aucune idée des instructions conditionnelles bash, jetez un œil à notre bref article sur le même sujet en utilisant le lien ci-dessous.
- Scripts Bash - Instructions conditionnelles
4. Zone de texte
La zone de texte lira et imprimera le fichier. Dans l'extrait ci-dessous, je lis le fichier ostechnix.txt. Le flag -scrolltext vous permet d'utiliser la molette de la souris pour faire défiler verticalement lorsque vous avez de longues pages de texte qui ne rentrent pas dans la fenêtre actuelle.
whiptail --textbox --scrolltext ostechnix.txt 10 80Zone de texte
5. Redirections
Les boîtes de dialogue que vous verrez dans la section suivante nécessitent que la sortie soit stockée dans une variable et utilisée ultérieurement pour le traitement. La valeur de retour du widget est envoyée à stderr au lieu de stdout. Vous devez donc échanger stdout et stderr pour que le résultat soit stocké dans la variable.
Vous devez utiliser l'expression suivante pour échanger stdout et stderr.
3>&1 1>&2 2>&3Essayons de comprendre l’expression ci-dessus. Vous savez que FD1 est la sortie standard et FD2 est l'erreur standard.
- 3>&1 - Tout ce qui est redirigé vers le descripteur de fichier 3 est redirigé vers le descripteur de fichier 1.
- 1>&2 - Tout ce qui est envoyé au descripteur de fichier 1 (Stdout) est redirigé vers le descripteur de fichier 2.
- 2>&3 - Tout ce qui est envoyé au descripteur de fichier 2 (stderr) est redirigé vers le descripteur de fichier 3.
De cette façon, nous échangeons stdout et stderr afin que la variable puisse stocker la valeur de retour des boîtes de dialogue.
6. Boîte de mot de passe
À l'aide de la boîte de dialogue de mot de passe, vous pouvez saisir des mots de passe qui ne seront pas affichés sous forme de texte brut lors de la saisie. Utilisez --passwordbox pour vous demander de saisir le mot de passe.
whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password"Boîte de dialogue Mot de passe
Lorsque vous appuyez sur
Sortie dans le terminal
Vous devez capturer le mot de passe dans une variable, puis l'utiliser ultérieurement dans le script. Comme indiqué dans la section Redirection, vous devez rediriger le résultat.
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"Stocker la sortie dans une variable
7. Zone de saisie
La boîte de dialogue de saisie invitera l'utilisateur à fournir l'entrée. Comme pour la boîte de dialogue de mot de passe, l'entrée que vous avez donnée sera imprimée sur le terminal si vous l'exécutez à partir du terminal. Vous devez utiliser les redirections et stocker la valeur dans une variable, puis l'utiliser ultérieurement pour le traitement selon la logique de votre programme.
NEW_USER=$(whiptail --title "Create New User" --inputbox "Username to be created" 8 40 3>&1 1>&2 2>&3)Zone de saisie
Stocker la sortie dans une variable
Vous pouvez également définir le texte de saisie par défaut. Tout ce que vous avez à faire est d'ajouter le texte après la hauteur et la largeur. Vous trouverez ci-dessous la syntaxe où au lieu de [init] vous placerez le texte par défaut.
--inputbox <text> <height> <width> [init]Exemple :
whiptail --title "Create New User" --inputbox "Username to be created" 8 40 nonameTexte par défaut
Combinons maintenant la zone de saisie, la zone de mot de passe, la zone Oui/Non et la zone de texte et écrivons un programme de création d'utilisateur simple pour voir comment ces boîtes de dialogue peuvent être couplées entre elles.
8. Boîte de dialogue Liste de contrôle
La liste de contrôle vous permet de créer une liste d'options parmi lesquelles un utilisateur peut sélectionner.
--checklist <text> <height> <width> <listheight> [tag item status]...Ci-dessus se trouve la syntaxe de création d’une boîte de dialogue de liste de contrôle. Vous devez utiliser le drapeau --checklist suivi de la configuration de la hauteur et de la largeur de la boîte de dialogue.
L'option <listheight> spécifie combien de listes allez-vous créer. Chaque liste sera étiquetée avec <status> qui est défini sur ON ou OFF. On pointe vers la liste sélectionnée et Off pointe vers aucune sélection de liste.
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" ONPour sélectionner une liste, appuyez sur la barre d'espace et utilisez les flèches haut et bas pour vous déplacer dans la liste. Une fois terminé, appuyez sur Entrée.
Boîte de dialogue Liste de contrôle
Vous pouvez stocker la sortie dans un tableau et l'utiliser ultérieurement. Les noms des balises (« Chrome, pip3, ksnip, virtualbox ») seront imprimés en sortie sur stderr en fonction de la sélection.
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 valuesExemple de résultat :
"pip3" "ksnip" "virtualbox"Si vous n'avez aucune idée des tableaux bash, nous avons un article détaillé sur les tableaux bash. Je vous suggère de jeter un œil au lien ci-dessous.
- Scripts Bash - Tableau indexé expliqué avec des exemples
9. Boîte de dialogue Liste des radios
La boîte de dialogue Liste radio est similaire à la boîte de dialogue Liste de contrôle, mais la seule différence est que vous ne pouvez choisir qu'une seule option dans la liste. Syntaxiquement, la liste radio et la liste de contrôle sont identiques.
--radiolist <text> <height> <width> <listheight> [tag item status]...Exemple :
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)Bouton radio
echo $SELECTED
virtualbox10. Boîte de dialogue Menu
La boîte de dialogue du menu est similaire à la boîte de dialogue du bouton radio. La seule différence que je ressens est que dans la boîte de dialogue du bouton radio, vous devez appuyer sur
La syntaxe est similaire à celle de la liste de contrôle et du bouton radio, mais la seule différence est qu'il n'est pas nécessaire que l'option « statut » soit activée/désactivée dans la boîte de dialogue du menu.
--menu <text> <height> <width> <listheight> [tag item]Exemple :
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)Boîte de dialogue Menu
echo $TO_RUN
backup11. Barre de progression
Pour créer une barre de progression, vous devez utiliser la syntaxe suivante. Tout d'abord, vous transmettrez un texte qui sera imprimé lorsque la barre de progression sera exécutée et définirez la hauteur et la largeur de la fenêtre suivies du pourcentage de progression.
--gauge <text> <height> <width> <percent>Le pourcentage de progression sera contrôlé par notre logique. Jetez un œil à l’extrait ci-dessous. Je redirige la boucle while vers la barre de progression et j'incrémente la variable COUNTER en 10 points qui seront utilisés comme pourcentage de progression.
#!/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}La barre de progression s’incrémentera par dizaines.
Boîte de dialogue Barre de progression
Conclusion
Nous sommes arrivés à la fin de cet article. Ici, nous avons brièvement vu comment utiliser Whiptail pour créer diverses boîtes de dialogue dans des scripts bash. Si vous avez déjà utilisé le whiptail et que vous avez une astuce sous l'esclave, partagez-la avec nous via la zone de commentaires.
Ressource :
- Fouet
Guides de script Bash :
- Comment utiliser la commande Date dans les scripts Bash sous Linux
- Comment déboguer les scripts Bash sous Linux et Unix
- Scripts Bash - Analyser les arguments dans les scripts Bash à l'aide de getopts
- Comment créer des boîtes de dialogue GUI dans des scripts Bash avec Zenity sous Linux et Unix
- Scripting Bash - Déclaration de cas
- Scripts Bash - Instructions conditionnelles
- Script Bash - Manipulation de chaînes
- Script Bash - Commande Printf expliquée avec des exemples
- Scripts Bash - Tableau indexé expliqué avec des exemples
- Scripts Bash - Tableau associatif expliqué avec des exemples
- Script Bash - Boucle For expliquée avec des exemples
- Script Bash - Boucle While et Until expliquée avec des exemples
- La redirection Bash expliquée avec des exemples
- Scripts Bash - Variables expliquées avec des exemples
- Scripts Bash - Fonctions expliquées avec des exemples
- La commande Bash Echo expliquée avec des exemples sous Linux
- Tutoriel Bash Heredoc pour les débutants













