Première boîte de dialogue : dialog et whiptail
Notions théoriques
Jusqu'ici, vos scripts communiquaient avec l'utilisateur uniquement par echo et read -p. Cela fonctionne, mais présente plusieurs limites : le texte défile dans le terminal, les choix possibles ne sont pas mis en valeur, et rien n'indique où l'on en est dans le déroulement du script.
Pour un script destiné à être utilisé par quelqu'un d'autre que son auteur (un collègue non technicien, un utilisateur lors d'une installation), une véritable interface graphique en mode texte rend le script beaucoup plus agréable et plus sûr à utiliser.
Vous avez déjà croisé ce type d'interface sans le savoir : la commande dpkg-reconfigure tzdata, qui configure le fuseau horaire d'une Debian, affiche des boîtes bleues avec des menus. C'est debconf qui s'appuie en coulisse sur whiptail ou dialog. Ce ne sont donc pas de simples gadgets, mais de vrais outils utilisés par les distributions elles-mêmes.
dialog et whiptail
dialog et whiptail sont deux commandes Linux qui affichent des boîtes de dialogue en mode texte (menus, messages, saisies...) directement dans le terminal, sans avoir besoin d'un environnement graphique.
whiptail | dialog | |
|---|---|---|
| Bibliothèque graphique | newt | ncurses |
| Présence sur Debian/Ubuntu | quasiment toujours installé (dépendance de debconf) | à installer |
| Widgets disponibles | msgbox, yesno, inputbox, passwordbox, menu, checklist, radiolist, gauge, infobox, textbox | tous ceux de whiptail + calendar, timebox, fselect, form, pause... |
| Poids | plus léger | plus riche |
Pour installer les deux et pouvoir choisir :
sudo apt update && sudo apt install dialog whiptail
On vérifie qu'un outil est disponible avec command -v :
command -v dialog
command -v whiptail
La syntaxe générale
dialog [options globales] --widget "texte" hauteur largeur [paramètres du widget]
Les options globales (comme --title "..." pour le titre du cadre, ou --backtitle "..." pour un bandeau permanent en haut de l'écran) se placent avant le nom du widget (--msgbox, --yesno...).
Les dimensions
Les deux nombres hauteur largeur sont exprimés en lignes et colonnes de terminal, pas en pixels :
dialog --msgbox "Bonjour !" 10 50
Une hauteur ou une largeur trop petite tronque le texte affiché, sans avertissement particulier. Prenez l'habitude de tester vos boîtes après les avoir écrites.
Les premiers widgets
--msgbox "texte" h l: affiche un message avec un seul bouton OK. Le script attend que l'utilisateur valide avant de continuer.--infobox "texte" h l: affiche un message mais ne bloque pas le script — il faut le faire suivre d'unsleepsi l'on veut laisser le temps de le lire.--yesno "texte" h l: affiche un message avec deux boutons, Yes et No. L'option--defaultnopré-sélectionne le bouton No, utile avant une action risquée.
Le code de retour
Toutes ces boîtes renvoient un code de retour dans $?, exactement comme n'importe quelle commande Linux (cours Les conditions) :
| Code | Signification |
|---|---|
0 | bouton OK, ou Yes |
1 | bouton Cancel, ou No |
255 | l'utilisateur a appuyé sur Échap |
La façon la plus naturelle d'utiliser ce code est de tester directement la commande dans un if :
if dialog --yesno "Continuer ?" 8 40; then
echo "L'utilisateur a répondu Oui"
else
echo "L'utilisateur a répondu Non (ou Échap)"
fi
$? ne contient le code de retour que de la dernière commande exécutée. Si vous intercalez un echo entre la boîte dialog et le test de $?, la valeur est perdue. Préférez tester directement dialog ... dans le if, comme ci-dessus.
Ne confondez pas le code 1 (l'utilisateur a explicitement répondu Non) et le code 255 (l'utilisateur a fui avec Échap) : dans un script d'administration, on veut parfois distinguer un refus assumé d'un abandon.
dialog ou whiptail : rester compatible avec les deux
whiptail et dialog acceptent presque toujours les mêmes options. Une astuce courante consiste à choisir l'outil disponible une fois en haut du script, dans une variable, puis à l'utiliser partout :
if command -v whiptail > /dev/null; then
DIALOG="whiptail"
elif command -v dialog > /dev/null; then
DIALOG="dialog"
else
echo "Ni dialog ni whiptail n'est installé." >&2
exit 1
fi
C'est cette convention "$DIALOG" que nous utiliserons dans tout ce sous-cours.
Nettoyer l'écran
Après la dernière boîte affichée, pensez à clear : les bibliothèques graphiques en mode texte (ncurses/newt) peuvent laisser le terminal dans un état visuel inhabituel.
Exemple pratique
#!/bin/bash
# Script : bienvenue_tui.sh
# Rôle : première prise en main de dialog/whiptail
# Auteur : Votre nom
set -eu
if command -v whiptail > /dev/null; then
DIALOG="whiptail"
elif command -v dialog > /dev/null; then
DIALOG="dialog"
else
echo "Ni dialog ni whiptail n'est installé." >&2
exit 1
fi
# Message d'accueil (bloquant, un seul bouton OK)
"$DIALOG" --backtitle "Outils d'administration" \
--title "Bienvenue" \
--msgbox "Cet outil va vous aider à sauvegarder vos dossiers." 8 50
# Confirmation avant de continuer
if "$DIALOG" --title "Confirmation" --yesno "Voulez-vous continuer ?" 8 50; then
clear
echo "Vous avez choisi de continuer."
else
clear
echo "Script interrompu par l'utilisateur."
exit 1
fi
Testez ce script tel quel : les boutons se déplacent avec les flèches du clavier ou la touche Tab, et se valident avec Entrée.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Nous transformons sauvegarde.sh (déjà écrit en niveau 1) en une première version avec interface : sauvegarde_tui.sh.
Étape 1 — Vérifier que l'outil est disponible
Un script qui utilise un outil externe (dialog, whiptail, jq...) doit vérifier sa présence en tout début d'exécution, plutôt que d'échouer avec un message obscur au milieu du traitement.
Étape 2 — Remplacer l'accueil par une boîte msgbox
Ajoutez --backtitle "Nom de votre outil" en début de chaque appel : ce bandeau reste affiché en haut de l'écran d'une boîte à l'autre et aide l'utilisateur à savoir dans quel outil il se trouve.
Étape 3 — Confirmer avant d'archiver
Pour une confirmation qui précède une action risquée (suppression, écrasement...), ajoutez --defaultno : le curseur se place alors sur le bouton No par défaut, ce qui évite une validation accidentelle en appuyant trop vite sur Entrée.