Bash Dialog

De Lea Linux
Aller à la navigation Aller à la recherche


Dialog avec le bash

Dialog avec le bash
par Marc
T'as d'belles boîtes t'sais ?

Introduction

Le programme dialog comporte de nombreuses "boîtes" et options qui permettent d'améliorer la présentation et donc la convivialité des scripts bash. De grandes distributions comme Debian et Slackware (célèbres entre toutes pour leur aspect user friendly...) l'utilisent d'ailleurs dans leurs scripts d'installation et de configuration. Vous-mêmes, vous ne pourrez bien utiliser dialog que si vous possédez déjà quelques connaissances des scripts bash. Si tel n'est pas le cas, consultez en priorité l'article [shell_script.php3 Introduction aux scripts]

Cette page de présentation de dialog n'a pas la structure d'un article traditionnel mais repose avant tout sur un script: demo_dialog.sh. Ce script a été écrit et commenté avec un souci de simplicité et de clarté. A chacune des "boîtes" de dialog qui y est présentée est associée une fonction afin que vous... Mais tout ceci est justement expliqué dans les commentaires placés au début du script que vous trouverez ci-dessous et dont voici le menu principal.

Si vous le souhaitez, continuez donc à lire cette page tout en faisant tourner le script dans un (x)terminal. Pour ce faire, [demo_dialog.txt téléchargez demo_dialog.txt] ; renommez-le en demo_dialog.sh (mv demo_dialog.txt demo_dialog.sh), rendez-le executable (chmod +x demo_dialog.sh) et enfin lancez-le (./demo_dialog.sh).

Démo dialog

#!/bin/sh
# Script de présentation de dialog
# demo_dialog.sh copyleft spi.marc 2004

# Pour découvrir dialog par la pratique :
# faites tourner ce script, examinez son code.

# Différentes boîtes de dialog sont ici présentées dans
# un contexte minimal. A chacune de ces boîtes correspond
# une fonction ; elles apparaissent dans l'ordre suivant.
# [message d'introduction à dialog (fonction intr)]
# Définition
# - d'une boîte d'information (fonction info)
# - d'une boîte de message (fonction mess)
# - d'une boîte de sélection de fichier (fonction fsel)
# - d'une boîte de fichier texte (fonction text)
# - d'une boîte de barre d'avancement (fonction gaug)
# - d'une boîte oui non (fonction yesn)
# - d'une boîte d'entrée de valeur (fonction inpu)
# - d'une boîte de mot de passe (fonction pass)
# - d'une boîte d'heure (fonction time)
# - d'une boîte de menu (fonction menu)
# [message sur les boîtes de cases à cocher (fonction mche)]
# - d'une boîte de cases à cocher (fonction chec)

# # # Début du script proprement dit # # #

# Définition d'un fichier temporaire
# Il sert à conserver les sorties de dialog qui sont normalement
# redirigées vers la sortie d'erreur (2). trap sert à être propre.
touch /tmp/dialogtmp && FICHTMP=/tmp/dialogtmp
trap "rm -f $FICHTMP" 0 1 2 3 5 15

# Définitions des différentes fonctions
# Message d'introduction à dialog
# (boîtes de message voyez plutôt la fonction mess)

function intr ()
{
dialog --backtitle "Présentation de dialog" --title "Introduction" \
--ok-label "Suite" --msgbox "
Dialog vous permet d'améliorer la présentation de vos
scripts bash en mode texte. Il comporte de nombreuses
boîtes et options, vous en découvrirez quelques unes
en utilisant ce script (console 80x25 recommandée).

En mode graphique vous pouvez utiliser xdialog dont la
syntaxe est proche de celle de dialog." 12 60

dialog --backtitle "Présentation de dialog" --title "Introduction (suite)" \
--msgbox "
Une instruction dialog possède la syntaxe suivante:
dialog --options communes --options de boîte

Par exemple --title est une option commune que l'on
peut utiliser avec toutes les boîtes. Alors que
--info est une option spécifique (de boîte info)." 12 60
}

# Définition d'une boîte d'information
function info ()
{
dialog --backtitle "Présentation de dialog" --title "Boîte d'information" \
--sleep 12 --infobox "
Ceci est une boîte d'information.
Sa syntaxe est --infobox text height width
Elle ne comporte pas de bouton par défaut.
Ici l'option --sleep 12 fixe son temps de vie à 12 s.

Pour la tester vous pouvez entrer dans une console:
dialog --sleep 4 --infobox Information 8 40" 12 60

}

# Définition d'une boîte de message
function mess ()
{
dialog --backtitle "Présentation de dialog" --title "Boîte de message" \
--msgbox "
Ceci est une boîte de message.
Sa syntaxe est --msgbox text height width
Elle ne comporte qu'un seul bouton par défaut.

Pour la tester vous pouvez entrer dans une console:
dialog --msgbox Message 8 40" 12 60

}

# Définition d'une boîte de sélection de fichier
function fsel ()
{
# message sur les boîtes de sélection de fichier (boîte de message)
dialog --backtitle "Présentation de dialog" --title "Les boîtes de sélection de fichier" \
--ok-label "Suite" --msgbox "
Une boîte de sélection de fichier permet ...
de sélectionner un fichier.
Sa syntaxe est --fselect filepath height width
Pour l'afficher vous pouvez entrer dans une console:
dialog --fselect $HOME/ 12 60

Voyez aussi la boîte suivante de ce script." 12 60
# boîte de sélection de fichier proprement dite
dialog --backtitle "Présentation de dialog" --title "Boîte de sélection de fichier" \
--ok-label "Valider" --fselect $HOME/ 8 60 2> $FICHTMP

# retour d'information (boîte d'info)
# 0 est le code retour du bouton Valider
# seul celui-ci permet ici de sélectionner un fichier.
if [ $? = 0 ]
then INFO="Le fichier sélectionné est `cat $FICHTMP`"
else INFO="Vous n'avez pas sélectionné de fichier!"
fi
dialog --backtitle "Présentation de dialog" --title "Votre sélection" \
--sleep 2 --infobox "
$INFO" 8 40
}

# Définition d'une boîte de fichier texte
function text ()
{
# message sur les boîtes de fichier texte (boîte de message)
dialog --backtitle "Présentation de dialog" --title "Les boîtes texte" \
--ok-label "Suite" --msgbox "
Une boîte texte permet d'afficher le contenu d'un
fichier texte passé en paramètre.
Sa syntaxe est --textbox file height width
Pour l'essayer vous pouvez entrer dans une console:
dialog --textbox /etc/inittab 18 60

La boîte texte suivante va afficher ce script.
Utilisez les 4 flèches pour vous déplacer." 14 60
# boîte de fichier texte proprement dite
# $0 est la variable correspondant au script
dialog --backtitle "Présentation de dialog" --title "Boîte de fichier texte" \
--textbox $0 18 60

}

# Définition d'une boîte de barre d'avancement
# La jauge avance par la redirection |
# de la sortie du sous shell ( ) qui la précède.
function gaug ()
{
(for i in `seq 0 10 100` ; do echo $i ; sleep 1 ; done) | \
dialog --backtitle "Présentation de dialog" --title "Boîte de barre d'avancement" \
--gauge "
Ceci est une boîte de barre d'avancement.
Sa syntaxe est --gauge text height width [percent]
Sa progression vient du sous shell () qui la précède.

Vous avez 10 secondes pour lire ce message.
" 12 60 0

}

# Définition d'une boîte oui non
function yesn ()
{
# boîte oui non proprement dite
dialog --backtitle "Présentation de dialog" --title "Boîte oui non" \
--yesno "
Ceci est une boîte oui non.
Elle sert bien sûr à poser une question fermée.
Sa syntaxe est --yesno text height width
Pour l'essayer vous pouvez entrer dans une console:
dialog --yesno Question 8 40

Souhaitez-vous quitter ce script ? " 12 60
# traitement de la réponse
# O est le code retour du bouton Oui
# ici Oui arrête le script
# toute autre action (Non, Esc, Ctrl-C) le poursuit
if [ $? = 0 ]
then exit 0
else
# boîte d'info
dialog --backtitle "Présentation de dialog" --title "Remerciements" \
--sleep 4 --infobox "
L'auteur de ce script vous trouve
de ce fait bien sympathique." 8 40
fi
}

# Définition d'une boîte d'entrée de valeur
function inpu ()
{
# boîte d'entrée de valeur proprement dite
dialog --backtitle "Présentation de dialog" --title "Boîte d'entrée" \
--inputbox "
Ceci est une boîte d'entrée.
Sa syntaxe est --inputbox text height width [init]
Ici l'option init est utilisée et contient user
Pour l'afficher vous pouvez entrer dans une console:
dialog --inputbox Entrée 8 40

Entrez votre nom de login:" 14 60 user 2> $FICHTMP
# retour d'information (boîte d'info)
# 0 est le code retour du bouton Accepter
# ici seul celui-ci attribue un nom de login.
if [ $? = 0 ]
then INFO="Votre nom de login est `cat $FICHTMP`"
else INFO="Vous n'avez pas de nom de login!"
fi
dialog --backtitle "Présentation de dialog" --title "Votre login" \
--sleep 2 --infobox "
$INFO" 8 40
}

# Définition d'une boîte de mot de passe
function pass ()
{
# boîte de mot de passe proprement dite
dialog --backtitle "Présentation de dialog" --title "Boîte de mot de passe" \
--insecure --passwordbox "
Ceci est une boîte de mot de passe.
Sa syntaxe est --passwordbox text height width [init]
Ici l'option --insecure est utilisée pour avoir des *
Pour la tester vous pouvez entrer dans une console:
dialog --passwordbox Password 8 40

Entrez un mot de passe fictif (il sera affiché):" 14 60 2> $FICHTMP
# retour d'information (boîte d'info)
# pour la démo, à éviter en temps normal !
# 0 est le code retour du bouton Accepter
# ici seul celui-ci attribue un mot de passe.
if [ $? = 0 ]
then INFO="Le mot de passe choisi est `cat $FICHTMP`"
else INFO="Vous n'avez pas de mot de passe!"
fi
dialog --backtitle "Présentation de dialog" --title "Votre mot de passe" \
--sleep 2 --infobox "
$INFO" 8 40
}

# Définition d'une boîte d'heure
function time ()
{
# boîte d'heure proprement dite
dialog --backtitle "Présentation de dialog" --title "Boîte d'heure" \
--timebox "
Ceci est une boîte d'heure. Sa syntaxe est
--timebox text height width [hour minute second]
Pour l'afficher vous pouvez entrer dans une console:
dialog --timebox Heure 4 40

Quelle est votre heure locale ?" 10 60 2> $FICHTMP
# retour d'information (boîte d'info)
# 0 est le code retour du bouton Accepter
# seul celui-ci permet de définir une heure différente.
if [ $? = 0 ]
then INFO="Votre heure locale est `cat $FICHTMP`"
else INFO="Vous n'avez pas défini d'heure.
L'heure par défaut est `date +%X`"
fi
dialog --backtitle "Présentation de dialog" --title "Heure locale" \
--sleep 2 --infobox "
$INFO" 8 40
}

# Définition d'une boîte de menu
function menu ()
{
# boîte de menu proprement dite
dialog --backtitle "Présentation de dialog" --title "Boîte de menu" \
--menu "
Ceci est une boîte de menu. Sa syntaxe est
--menu text height width menu-height [tag item] ...
Elle permet de faire un choix parmi une liste.

Choisissez une des entrées proposées:" 18 60 6 \
"Continuer" "Continuer selon les choix déjà faits" \
"Introduction" "Relire l'intro à dialog puis continuer" \
"Arrêter" "Et au revoir..." 2> $FICHTMP

# traitement de la réponse
if [ $? = 0 ]
then
for i in `cat $FICHTMP`
do
case $i in
# Continuer est par défaut
Introduction) intr ;;
Arrêter) exit 0 ;;
esac
done
fi
}

# Message sur les boîtes de cases à cocher
# (boîtes de message voyez plutôt la fonction mess)

function mche ()
{
dialog --backtitle "Présentation de dialog" --title "Les boîtes de cases à cocher" \
--ok-label "Suite" --msgbox "
Une boîte de cases à cocher permet de proposer un menu
à choix multiples. Sa syntaxe est --checklist
text height width list-height [tag item status] ...

Le menu principal de ce script est une boîte de ce
type. Vous la retrouverez en quittant cet écran." 12 60
}

# Définition d'une boîte de cases à cocher
# Menu principal de choix des boîtes du script
function chec ()
{
# boîte de cases à cocher proprement dite
dialog --backtitle "Présentation de dialog" --title "Liste des boîtes" \
--ok-label "Valider" --cancel-label "Quitter" \
--checklist "
Cochez les boîtes dont vous souhaitez une présentation." 18 60 10 \
"intr" "Introduction à dialog" off \
"info" "Boîte d'information" off \
"mess" "Boîte de message" off \
"fsel" "Boîte de sélection de fichier" off \
"text" "Boîte de fichier texte" off \
"gaug" "Boîte de barre d'avancement" off \
"yesn" "Boîte oui non" off \
"inpu" "Boîte d'entrée de valeur" off \
"pass" "Boîte de mot de passe" off \
"time" "Boîte d'heure" off \
"menu" "Boîte de menu" off \
"mche" "Boîte de cases à cocher (message sur)" off 2> $FICHTMP

# traitement de la réponse
# 0 est le code retour du bouton Valider
# ici seul le bouton Valider permet de continuer
# tout autre action (Quitter, Esc, Ctrl-C) arrête le script.
if [ $? = 0 ]
then
for i in `cat $FICHTMP`
do
case $i in
\"intr\") intr ;;
\"info\") info ;;
\"mess\") mess ;;
\"fsel\") fsel ;;
\"text\") text ;;
\"gaug\") gaug ;;
\"yesn\") yesn ;;
\"inpu\") inpu ;;
\"pass\") pass ;;
\"time\") time ;;
\"menu\") menu ;;
\"mche\") mche ;;
esac
done
else exit 0
fi
}

# Fin des définitions des fonctions
# Boucle d'appel du menu principal à l'infini

while :
do chec
done

# dialog offre de nombreuses autres possibilités.
# A vous maintenant de les découvrir au travers
# par exemple de sa page man :o)

# # # Fin du script # # #

Conclusion

Le programme dialog offre bien d'autres possibilités qui ne sont ni présentées dans cette page ni exploitées dans le script. On ne peut faire simple et compliqué à la fois. La plupart des boîtes ont été mises dans un contexte minimum que vous pouvez enrichir. Ainsi par exemple certains boutons et codes retour n'ont pas été utilisés. En voici la liste car ils pourraient cependant vous être utiles. Les boutons pouvant être renommés à volonté, les labels attribués peuvent donc varier selon les scripts.

Bouton Yes ou OK (Oui ou Accepter) : 0
Bouton No ou Cancel (Non ou Annuler) : 1
Bouton Help (Aide) : 2
Bouton Extra : 3
Touche Esc : 255
Erreurs dans dialog : -1

Maintenant que vous avez fait connaissance avec dialog, et avez certainement compris le principe général de son fonctionnement, vous pourrez tirer plus de profit de sa page man dont voici une traduction française.

Merci d'avoir lu cet article. Si en utilisant le script vous y trouviez quelques bugs, merci de me mailer afin de m'en avertir. Si vous avez des idées d'améliorations qui s'accordent avec la simplicité et la lisibilité souhaitées de l'ensemble, merci aussi de m'en faire part... en joignant autant que possible le code correspondant à celles-ci.

Merci à Léa d'avoir accepté de publier cet article.


Autres ressources




@ Retour à la rubrique Développement


Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Marc le 30/12/2004.

Copyright

Copyright © 30/12/2004, Marc

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike iconCreative Commons Noncommercial
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique, Contexte non commercial 2.0 :
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/