Recherche de site Web

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 -y

Fedora/RHEL/CnetOS/AlmaLinux/Rocky Linux :

sudo dnf install newt

Arch Linux, EndeavourOS, Manjaro Linux :

sudo pacman -S whiptail

Linux alpin :

apk add newt

Option 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 ou . Lorsque vous appuyez sur , il affichera un code de retour 0 et si vous appuyez sur , il affichera un code de retour 255. .

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

Messagerie

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 ou .

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 , elle lancera un retour< code 0 et lorsque vous appuyez sur , il lancera le code de retour 1.

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 80

Zone 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>&3

Essayons 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 , le code retour 0 sera renvoyé et le mot de passe que vous avez tapé sur la console (stderr) si vous exécutez depuis le terminal.

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 noname

Texte 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" ON

Pour 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 values

Exemple 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
virtualbox

10. 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 pour sélectionner un élément dans la liste, puis appuyer sur Entrée. Mais dans la boîte de dialogue du menu, tout ce que vous avez à faire est simplement d'appuyer sur Entrée, ce qui renverra le nom de la balise à stderr.

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 
backup

11. 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

Articles connexes