bash dialog example
Примеры кода для создания интерактивных интерфейсов в bash с помощью dialog.
Примеры
--backtitle <TEXT>
- название в левом верхнем углу экрана--checklist <TEXT> <WIND_HEIGHT> <LENGTH> <LIST_HEIGHT>
- выбор нескольких вариантов--radiolist <TEXT> <WIND_HEIGHT> <LENGTH> <LIST_HEIGHT>
- выбор одного варианта--inputbox <TEXT> <WIND_HEIGHT> <LENGTH> <LIST_HEIGHT>
yesno <TEXT> <WIND_HEIGHT> <LENGTH>
- запрос на согласие, даёт код возврата
Добавление дополнительной кнопки в меню
dialog --extra-button --extra-label 123 --menu 0 0 0 0 0 0
при нажатии на дополнительную кнопку код возврата будет равен 3
Больше одной дополнительной кнопки не удалось мне сделать
Захват вывода
Если надо ловить вывод, того что ввёл пользователь, то надо выкатывать error_out в файл(2>”MyFile”)
Либо использовать такой вывод:
value=$(dialog --menu 'lala' 10 42 1 1 1 3>&1 1>&2 2>&3 3>&-)
То есть мы сначала, выводим пустой дескриптор 3
в stdout
, затем stdout
в stderr
,
чтобы отобразился dialog, потом stderr
в 3
, чтобы получить в переменную значение,
а по скольку порядок важен, поэтому в stdin
получаем только переменну, а всё остальное
идёт на экран.
Требуется такие сложности, потому что вывод из dialog происходит в stdout
, а то что ввёл пользователь в stderr
.
Если вывод имеет код возврата, то ловим его
-
Код 255 - означает, что клиент ввёл
Esc
.CTRL-C
то же самое что нет вyesno
-
Из checklist вывод в файл происходит в ковычках, поэтому можно удялять их
sed -i 's/"//g'
Если вывод происходит в переменную, то можно её потом почистить
example=${example//\"/}
. -
Есть врапперы для питона в dialog. Вроде они удобнее, потому что есть нормальные списки и другие функции, не надо придумывать велосипеды, чтобы избавляться от ковычек в выводе
checklist
, например.
strict mode bash
Для применения set -eu
можно либо выключать set +e
strict mode на время запуска диалога, либо
использовать что-то на примере:
set -eu
declare RC=""
lala=$(dialog --menu 20 20 1 2 3 4 5 6 3>&1 1>&2 2>&3 3>&- ) || RC=$?
if [ $RC = 0 ];
echo lala
else
echo nelala
fi
То есть мы ловим код возврата и обрабатываем все варианты
#linux #bash