GNU/Linux >> Tutoriels Linux >  >> Linux

Comment créer des boîtes de dialogue GUI dans des scripts Bash avec Whiptail sous Linux

Il y a quelque temps, nous avons brièvement parlé 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 de shell. Dans cet article, nous allons discuter d'un autre utilitaire d'interface graphique 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'utiliser une interface graphique.

Whiptail est un utilitaire graphique convivial qui utilise un newt bibliothèque de programmation. Whiptail propose différentes boîtes de dialogue à des fins différentes. Selon 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

Alpin Linux :

$ apk add newt

Option d'aide

Vous pouvez utiliser --help drapeau qui affichera la liste des boîtes de dialogue prises en charge et d'autres options que vous pouvez utiliser. Au total, 10 boîtes de dialogue sont prises en charge avec diverses fonctionnalités et nous les examinerons toutes dans les sections à venir.

Options de
$ 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 message

La boîte de message affichera les messages destinés à l'utilisateur et attendra que l'utilisateur appuie sur ou clé. Lorsque vous appuyez sur il lancera un code de retour 0 et si vous appuyez sur il lancera le code de retour 255 .

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

Décodons la commande ci-dessus.

--titre  Cela ajoutera un titre à la fenêtre  
--msgbox   Ceci 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 dans un é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 interruptible (attente de la fin d'un événement).

2. Boîte d'informations

L'information est similaire à la boîte de message mais la différence est différente de la boîte d'information de la boîte de message n'attendra pas l'entrée de l'utilisateur. Utilisez –-infobox flag et passez une chaîne comme argument qui sera affiché dans la boîte d'information.

Dans certains shells, la boîte d'informations s'exécutera mais n'affichera aucun résultat. Vous devez changer 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 

3. Case Oui/Non

Oui/Non Box affichera une boîte de dialogue avec OUI ou NON option où si vous choisissez il lancera un retour code 0 et lorsque vous appuyez sur il lancera le code retour 1 .

Utilisez --yesno drapeau pour demander le choix. Exécutez l'extrait de code suivant qui combine la boîte oui/non et la boîte de message. Au début, il affichera l'option Oui/Non, et selon votre choix, il lancera 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 

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 ostechnix.txt dossier. Le drapeau –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 tiennent pas dans la fenêtre actuelle.

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

5. Redirections

Les boîtes de dialogue que vous allez voir 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. Il faut donc permuter 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 s'afficheront pas sous forme de texte brut lors de la saisie. Utilisez --passwordbox pour demander d'entrer le mot de passe.

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

Lorsque vous appuyez sur , il lancera le code de retour 0 et renverra le mot de passe que vous avez tapé à la console (stderr) si vous exécutez depuis 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"

7. Zone de saisie

La boîte de dialogue d'entrée 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)

Vous pouvez également définir le texte d'entrée par défaut. Tout ce que vous avez à faire est d'ajouter le texte après la hauteur et la largeur. 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

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.

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 la --checklist suivi de la configuration de la hauteur et de la largeur de la boîte de dialogue.

L'option <listheight> spécifie le nombre de listes que vous allez créer. Chaque liste sera étiquetée avec <status> qui est réglé 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.

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 de la liste des radios est similaire à la boîte de dialogue de la 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)
$ 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 d'appuyer sur Entrée, ce qui renverra le nom de la balise à stderr.

La syntaxe est similaire à la liste de contrôle et au bouton radio, mais la seule différence est qu'il n'est pas nécessaire que l'option "état" soit définie sur ON/OFF 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)
$ 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 passerez un texte qui sera imprimé lorsque la barre de progression est en cours d'exécution et définissez 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 incréments de 10.

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


Linux
  1. Comment créer des threads sous Linux (avec un exemple de programme C)

  2. Comment créer un système de fichiers ZFS avec compression de fichiers sous Linux

  3. Comment créer un fichier avec une taille donnée sous Linux ?

  4. Comment créer un pic CPU avec une commande bash

  5. Comment Linux gère-t-il les scripts shell ?

Comment analyser les fichiers CSV dans les scripts Bash sous Linux

Comment créer un groupe de volumes sous Linux avec LVM

Comment utiliser whiptail pour créer des scripts interactifs plus conviviaux

Comment créer des documents avec des scripts Bash

Comment utiliser la commande echo dans les scripts Bash sous Linux

Comment travailler avec l'instruction Case dans les scripts Bash