Aller au contenu principal

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.

info

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.

whiptaildialog
Bibliothèque graphiquenewtncurses
Présence sur Debian/Ubuntuquasiment toujours installé (dépendance de debconf)à installer
Widgets disponiblesmsgbox, yesno, inputbox, passwordbox, menu, checklist, radiolist, gauge, infobox, textboxtous ceux de whiptail + calendar, timebox, fselect, form, pause...
Poidsplus légerplus 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
attention

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'un sleep si l'on veut laisser le temps de le lire.
  • --yesno "texte" h l : affiche un message avec deux boutons, Yes et No. L'option --defaultno pré-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) :

CodeSignification
0bouton OK, ou Yes
1bouton Cancel, ou No
255l'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
attention

$? 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.

attention

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
astuce

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


Que renvoie dialog --yesno quand l'utilisateur choisit "No" ?


Que signifient les deux nombres dans dialog --msgbox "Bonjour" 10 50 ?


Pourquoi whiptail est-il souvent déjà installé sur une Debian ?


Quel code de retour signifie que l'utilisateur a appuyé sur Échap ?


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


Bonne pratique - Vérifier ses dépendances

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


Bonne pratique - Un backtitle pour se repérer

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


Bonne pratique - --defaultno sur les actions destructives

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.

📌 Une solution