Je cherche à créer un environnement basé sur un terminal pour y adapter mon script Bash . Je veux que ça ressemble à ceci:
dialog --backtitle "Package configuration" \
--title "Configuration Sun-Java-jre" \
--yesno "\nBla bla bla...\n\nDo you accept?" 10 30
La réponse de l'utilisateur est stockée dans le code de sortie, elle peut donc être imprimée comme d'habitude: echo $?
(Notez que 0
Signifie "oui" et 1
Est "non" dans le Monde de Shell).
Concernant les autres questions de la section des commentaires:
pour mettre dans la boîte de dialogue la sortie d'une commande, utilisez simplement le mécanisme de substitution de commande $()
, par exemple:
dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
pour donner à l'utilisateur plusieurs choix, vous pouvez utiliser l'option --menu
au lieu de --yesno
pour stocker la sortie du choix de l'utilisateur dans la variable, il faut utiliser l'option --stdout
ou changer le descripteur de sortie soit via --output-fd
soit manuellement, par exemple:
output=$(dialog --backtitle "Package configuration" \
--title "Configuration Sun-Java-jre" \
--menu "$(parted -l)" 15 40 4 1 "sda1" 2 "sda2" 3 "sda3" \
3>&1 1>&2 2>&3 3>&-)
echo "$output"
Cette astuce est nécessaire car dialog
par défaut renvoie à stderr, pas à stdout.
Et comme toujours, man dialog
Est votre ami.
La capture d'écran de la question ressemble à whiptail (un programme fonctionnellement réduit imitant dialogue , utilisant newt plutôt que ncurses ). La façon dont le titre et les boutons sont rendus est intégrée dans chaque programme, ce qui les rend différents.
Voici un script qui duplique la capture d'écran d'origine, pour whiptail ou dialog:
#!/bin/sh
: ${DIALOG:=dialog}
case "$DIALOG" in
*dialog*)
OPTS="$OPTS --cr-wrap"
high=10
;;
*whiptail*)
high=12
;;
esac
rows=$(stty size | cut -d' ' -f1)
[ -z "$rows" ] && rows=$high
[ $rows -gt $high ] && rows=$high
cols=$(stty size | cut -d' ' -f2)
$DIALOG --backtitle "Package configuration" \
--title "Configuring Sun-Java6-jre" \
$OPTS \
--yesno '\nIn order to install this package, you must accept the license terms, the "Operating System Distributor License for Java" (DLJ), v1.1. Not accepting will cancel the installation.\n\nDo you accept the DLJ license terms?' $rows $((cols - 5))
et pour comparaison, capture d'écran avec whiptail:
et avec dialogue:
Outre l'apparence différente du titre et des boutons, la boîte de dialogue utilise différentes couleurs par défaut (bien que cela soit configurable — voir les captures d'écran ), et elle utilise moins de lignes à l'écran.
dialog (et whiptail) utilisent des bibliothèques pour gérer l'affichage des lignes, des couleurs, etc. Mais vous pouvez également voir newt utilisé dans le programme Red Hat anaconda comme une bibliothèque partagée appelée depuis python (avec la même apparence). Dans le même esprit, le programme de configuration du noyau a commencé comme une copie (abrégée) de la boîte de dialogue, puis a évolué vers des fonctionnalités utilisant une bibliothèque partagée (sans le programme lxdialog
d'origine) un peu comme la façon dont newt est utilisé depuis python.
Depuis bash - vous pouvez utiliser la boîte de dialogue ou le whiptail pour les fonctionnalités les plus couramment utilisées. Quelqu'un a écrit un wrapper pour ceux-ci (en Perl) pour permettre aux scripts d'utiliser plus facilement ceux-ci ou quelques autres, mais il vaut mieux utiliser directement la boîte de dialogue car le module Perl est essentiellement un dénominateur commun.
Les sources de dialogue incluent des exemples de tous les widgets ainsi que la plupart des options de ligne de commande:
cdialog (ComeOn Dialog!) version 1.3-20160424
Copyright 2000-2015,2016 Thomas E. Dickey
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* Display dialog boxes from Shell scripts *
Usage: cdialog <options> { --and-widget <options> }
where options are "common" options, followed by "box" options
Special options:
[--create-rc "file"]
Common options:
[--ascii-lines] [--aspect <ratio>] [--backtitle <backtitle>] [--beep]
[--beep-after] [--begin <y> <x>] [--cancel-label <str>] [--clear]
[--colors] [--column-separator <str>] [--cr-wrap] [--date-format <str>]
[--default-button <str>] [--default-item <str>] [--defaultno]
[--exit-label <str>] [--extra-button] [--extra-label <str>]
[--help-button] [--help-label <str>] [--help-status] [--help-tags]
[--hfile <str>] [--hline <str>] [--ignore] [--input-fd <fd>]
[--insecure] [--item-help] [--keep-tite] [--keep-window] [--last-key]
[--max-input <n>] [--no-cancel] [--no-collapse] [--no-cr-wrap]
[--no-items] [--no-kill] [--no-label <str>] [--no-lines] [--no-mouse]
[--no-nl-expand] [--no-ok] [--no-shadow] [--no-tags] [--nook]
[--ok-label <str>] [--output-fd <fd>] [--output-separator <str>]
[--print-maxsize] [--print-size] [--print-version] [--quoted]
[--scrollbar] [--separate-output] [--separate-widget <str>] [--shadow]
[--single-quoted] [--size-err] [--sleep <secs>] [--stderr] [--stdout]
[--tab-correct] [--tab-len <n>] [--time-format <str>] [--timeout <secs>]
[--title <title>] [--trace <file>] [--trim] [--version] [--visit-items]
[--week-start <str>] [--yes-label <str>]
Box options:
--buildlist <text> <height> <width> <list-height> <tag1> <item1> <status1>...
--calendar <text> <height> <width> <day> <month> <year>
--checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...
--dselect <directory> <height> <width>
--editbox <file> <height> <width>
--form <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
--fselect <filepath> <height> <width>
--gauge <text> <height> <width> [<percent>]
--infobox <text> <height> <width>
--inputbox <text> <height> <width> [<init>]
--inputmenu <text> <height> <width> <menu height> <tag1> <item1>...
--menu <text> <height> <width> <menu height> <tag1> <item1>...
--mixedform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>...
--mixedgauge <text> <height> <width> <percent> <tag1> <item1>...
--msgbox <text> <height> <width>
--passwordbox <text> <height> <width> [<init>]
--passwordform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
--pause <text> <height> <width> <seconds>
--prgbox <text> <command> <height> <width>
--programbox <text> <height> <width>
--progressbox <text> <height> <width>
--radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...
--rangebox <text> <height> <width> <min-value> <max-value> <default-value>
--tailbox <file> <height> <width>
--tailboxbg <file> <height> <width>
--textbox <file> <height> <width>
--timebox <text> <height> <width> <hour> <minute> <second>
--treeview <text> <height> <width> <list-height> <tag1> <item1> <status1> <depth1>...
--yesno <text> <height> <width>
Auto-size with height and width = 0. Maximize with height and width = -1.
Global-auto-size if also menu_height/list_height = 0.
Lectures complémentaires:
Je crois que le package que vous recherchez est ncurses .
Wikipedia décrit ncurses comme suit:
ncurses (new curses) est une bibliothèque de programmation fournissant une API qui permet au programmeur d'écrire des interfaces utilisateur basées sur du texte d'une manière indépendante du terminal. Il s'agit d'une boîte à outils pour développer un logiciel d'application "de type GUI" qui fonctionne sous un émulateur de terminal
Il est largement utilisé, par exemple, dans l'outil de configuration du noyau menuconfig:
Puisque vous utilisez bash, vous pouvez utiliser Bash Simple Curses (comme mentionné par Runium dans le commentaire ci-dessous).
zénité
zenity --file-selection --directory
.
# var means variable
var\
=$(
zenity --entry \
--title="title" \
--text="text" \
--entry-text="entry text" \
) \
&&
echo "$var"
password=$(zenity --password)
file="$(zenity --file-selection)"
# ls is a command to list files in a directory
ls $(zenity --file-selection --directory)
# Aidez-moi
zenity --help
zenity --help-general
zenity --help-entry
autres interfaces utilisateur graphiques (gui)
dialog
dialog \
--backtitle "backtitle" \
--title "title" \
--yesno \
"bla bla bla...\n\n Do you accept?" \
0 -1
echo $?
arrête l'exécution du script, l'interrompt. la commande echo $? , ne se produira jamais