Леонид МаслаковLenpaste

Whiptail - псевдографические диалоговые окна в терминале

10.03.2022

Whiptail доступен в Linux и *BSD системах. Установка осуществляется из пакетного менеджера.

Сообщение

Скриншот: Whiptail msgbox

Значения 10 60 - обозначают высоту и ширину.

whiptail --title "Важное сообщение!" \
--ok-button "продолжить" \
--msgbox "Здесь должна быть важная информация." 10 60

Скриншот: Whiptail scrolltext

Также можно отобразить содержимое файла. Например текст свободной лицензии GPL 3:

whiptail --title "Лицензия GPL 3" \
--ok-button "принять" --scrolltext \
--textbox /usr/share/common-licenses/GPL-3 20 60

Диалог да/нет

Скриншот: Whiptail yesno

В данном случаи ответ возвращается с помощью кода завершения программы. Да - 0. Нет - 1.

if (whiptail --title "Да или нет?" --yesno "Да или нет?" 10 60) then
	echo "Вы выбрали ДА"
else
	echo "Вы выбрали НЕТ"
fi

Скриншот: Whiptail yesno - цитата из Матрицы

Так же можно переназначить описание кнопок и убрать заголовок:

if (whiptail --yes-button "красная" --no-button "синея" \
--yesno "Примешь синюю таблетку и сказке конец.\nПримешь красную таблетку - войдёшь в страну чудес." 10 60) then
	echo "Красная таблетка"
else
	echo "Синея таблетка"
fi

Ввод текста

Скриншот: Whiptail inputbox

3>&1 1>&2 2>&3 - эта конструкция позволяет вернуть скрипту данные, введённые пользователем. Работает это так:

  1. Создаётся файловый дескриптор 3, указывающий на stdout
  2. stdout перенаправляется в stderr
  3. stderr перенаправляется на 3 дескриптор, на который указывает stdout
NAME=$(whiptail --title "Ваше имя" \
--ok-button "продолжить" --cancel-button "отмена" \
--inputbox "Введите ваше ФИО:" 10 60 "Иванов Иван Иванович" 3>&1 1>&2 2>&3)

if [ $? = 0 ]; then
	echo "Ваше имя: $NAME"
else
	echo "Отмена"
fi

Ввод пароля

Скриншот: Whiptail passwordbox

PASSWORD=$(whiptail --title "Новый пароль" \
--ok-button "продолжить" --cancel-button "отмена" \
--passwordbox "Придумайте новый пароль:" 10 60 "root" 3>&1 1>&2 2>&3)

if [ $? = 0 ]; then
	echo "Пароль: $PASSWORD"
else
	echo "Отмена"
fi

Меню

Скриншот: Whiptail menu

15 60 5 - цифра 5, обозначает количество пунктов меню, помещающихся на экране. То есть 6 пункт будет уже скрыт.

Кстати, номера можно скрыть с помощью флага --notags.

OPTION=$(whiptail --title "Меню" --menu "Выберите блюдо:" 15 60 5 \
--ok-button "продолжить" --cancel-button "отмена" \
"1" "Котлетки с макарошками" \
"2" "Котлетки с пюрешкой" \
"3" "Рис с рыбой" \
"4" "Тушёнка" \
"5" "Суп гороховый" \
"6" "Овощи с мясом" \
3>&1 1>&2 2>&3)

if [ $? = 0 ]; then
	echo "Пользователь выбрал пункт номер $OPTION"
else
	echo "Отмена"
fi

Выбор одного значения

Скриншот: Whiptail radiolist

ON/OFF - отвечают за выбор пунктов по умолчанию.

OPTION=$(whiptail --title "Выбирай!" \
--ok-button "продолжить" --cancel-button "отмена" \
--radiolist "Кто тут самый главный анархист?" 15 60 4 \
"1" "Инструкция по выживания" OFF \
"2" "Гражданская Оборона" ON \
"3" "Великие Октябри" OFF \
3>&1 1>&2 2>&3)

if [ $? = 0 ]; then
	echo "Пользователь выбрал пункт номер $OPTION"
else
	echo "Отмена"
fi

Выбор нескольких значений

Скриншот: Whiptail checklist

OPTION=$(whiptail --title "Лучшие игры" --checklist \
--ok-button "продолжить" --cancel-button "отмена" \
"Игры всех времён и народов:" 15 60 8 \
"1" "Super Tux Kart" OFF \
"2" "Counter-Strike 1.6" OFF \
"3" "Quake 3 Arena" ON \
"4" "Half-Life 2" ON \
3>&1 1>&2 2>&3)

if [ $? = 0 ]; then
	echo "Выбранные пункты: $OPTION"
else
	echo "Отмена"
fi

Прогресс бар

Скриншот: Whiptail gauge

6 60 0 - 0 обозначает количество процентов, с которого начинается отсчёт.

{
	sleep 1
	echo "20"
	sleep 1
	echo "40"
	sleep 1
	echo "60"
	sleep 1
	echo "80"
	sleep 1
	echo "100"

} | whiptail --gauge "Пожалуйста подождите..." 6 60 0

Ссылки