Shell中的TUI与GUI
简介
在 Shell 中创建 TUI 格外方便且简单。这可以说是一大优势了。
Dialog
dialog是基于ncurses库的,在Linux的命令行下实现TUI界面的工具。
安装
1  | # Debian  | 
用法
dialog的语法为:dialog [选项] --title "标题" --控件类型 "描述" 高 宽 控件属性
当高 宽为0 0时,进行自动大小调整。
当高 宽为1 1时,进行最大化。列表高度或菜单高度为0时,进行自动大小调整。
在窗口中,选择OK或Yes,dialog返回0,选择Cancel或No,dialog返回1,按下ESC,dialog返回255。
dialog的图形界面通过标准输出流打印,选择与输入结果通过标准错误流打印,要将结果保存到变量,要么使用2> 文件进行过渡,要么通过3>&1 1>&2 2>&3临时交换标准输出与标准错误,对于列表变量,还要通过($变量名)转换为数组变量。
选项
选项有以下几项:
1  | --stderr # 以标准错误方式输出  | 
控件
| 类型 | 选项 | 含义 | 
|---|---|---|
| 日历框 | --calendar "描述" 高 宽 [日 月 年] | 
提供了一个日历,让用户选择日期,打印到错误输出 | 
| 时间框 | --timebox [--time-format 格式] "描述" 高 宽 | 
提供一个窗口,选择小时,分钟,秒,打印到错误输出 | 
| 文件选择框 | --fselect "目录路径" 高 宽 | 
提供一个路径,让用户选择文件,路径打印到错误输出 | 
| 进度框 | --gauge "描述" 高 宽 起始百分比 | 
类似于pv命令,接受标准输入,按百分比显示输入进度 | 
| 单选框 | --radiolist "描述" 高 宽 菜单高度 "标签1" "内容1" on或off | 
让用户选择列表中的单个选项,打印选择的标签到错误输出 | 
| 菜单框 | --menu [--no-tags] [--no-items] "描述" 高 宽 菜单高度 "标签1" "内容1"... | 
让用户选择菜单中的单个选项,打印选择的标签到错误输出 | 
| 复选框 | --checklist [--no-tags] [--no-items] "描述" 高 宽 菜单高度 "标签1" "内容1" on或off... | 
让用户选择列表中的多个选项,打印空格分隔的标签列表到错误输出 | 
| 信息框 | --infobox "描述" 高 宽 | 
对话框立刻显示消息并继续执行,但并不清除屏幕 | 
| 输入框 | --inputbox "描述" 高 宽 ["初始输入内容"] | 
允许用户输入文本,将输入内容打印到错误输出 | 
| 密码框 | --passwordbox --insecure "描述" 高 宽 ["初始输入内容"] | 
类似于输入库,但是不在窗口中显示输入内容 | 
| 消息框 | --msgbox "描述" 高 宽 | 
向用户显示一条消息,同时显示一个OK按钮,用户确认后才会继续操作 | 
| 文本框 | --textbox [--scrollbar] "文件路径" 高 宽 | 
在带有滚动条的文本框中显示一个文件的内容 | 
| 反文本框 | --tailbox "文件路径" 高 宽 | 
从下而上的在文本框中显示一个文件的内容 | 
| 编辑框 | --editbox "文件路径" 高 宽 | 
在窗口中编辑一个文件 | 
| 是/否框 | --yesno [--defaultno] "描述" 高 宽 | 
进行提问,用户可以选择yes或no,yes返回0,no返回1 | 
Whiptail
whiptail是由红帽开发的,基于newt库的全新(1998年)TUI界面工具,相比于dialog,whiptail精简了部分选项,简化了用法,同时又保留了很大程度的兼容。目前大部分发行版制作的TUI工具都基于whiptail。
安装
1  | # Debian  | 
用法
whiptail的语法为:whiptail [选项] --title "标题" --控件类型 "描述" 高 宽 控件属性
当高 宽为0 0时,进行自动大小调整。
当高 宽为1 1时,进行最大化。
当控件属性的列表高度或菜单高度为0时,进行自动大小调整。
在窗口中,选择OK或Yes,whiptail返回0,选择Cancel或No,whiptail返回1,按下ESC,whiptail返回255。
whiptail的图形界面通过标准输出流打印,选择与输入结果通过标准错误流打印,要将结果保存到变量,要么使用2> 文件进行过渡,要么通过3>&1 1>&2 2>&3临时交换标准输出与标准错误输出,对于列表变量,还要通过($变量名)将其转换为数组变量。
resize命令会打印出whiptail的LINES与COLUMNS变量,它们决定着whiptail的窗口大小,可以通过eval $(resize)命令获取这两个变量,并在之后用于设定。
选项
选项有以下几项:
1  | --seperate-output # 对于列表,将分隔符从空格转换为换行符  | 
控件
| 类型 | 选项 | 含义 | 
|---|---|---|
| 进度框 | --gauge "描述" 高 宽 起始百分比 | 
类似于pv命令,接受标准输入,按百分比显示输入进度 | 
| 单选框 | --radiolist "描述" 高 宽 菜单高度 "标签1" "内容1" on或off... | 
让用户选择列表中的单个选项,打印选择的标签到错误输出 | 
| 菜单框 | --menu [--notags] [--noitems] "描述" 高 宽 菜单高度 "标签1" "内容1"... | 
让用户选择菜单中的单个选项,打印选择的标签到错误输出 | 
| 复选框 | --checklist [--notags] [--noitems] "描述" 高 宽 菜单高度 "标签1" "内容1" on或off... | 
让用户选择列表中的多个选项,打印空格分隔的标签列表到错误输出 | 
| 信息框 | --infobox "描述" 高 宽 | 
立刻显示一个消息并退出,然后继续执行,但并不清除屏幕 | 
| 输入框 | --inputbox "描述" 高 宽 ["初始输入内容"] | 
允许用户输入文本,将输入内容打印到错误输出 | 
| 密码框 | --passwordbox "描述" 高 宽 ["初始输入内容"] | 
类似于输入框,但是不在窗口中显示输入内容 | 
| 消息框 | --msgbox "描述" 高 宽 | 
向用户显示一条消息,同时显示一个OK按钮,用户确认后才会继续操作 | 
| 文本框 | --textbox [--scrolltext] "文件路径" 高 宽 | 
在带有滚动条的文本框中显示一个文件的内容 | 
| 是/否框 | --yesno [--defaultno] [--yes-button "内容"] [--no-button "内容"] "描述" 高 宽 | 
进行提问,用户可以选择yes或no,yes返回0,no返回1 | 
实例
均以whiptail为例。
二选一
1  | if (whiptail --title "" --yesno "Choose between Yes and No:" 0 0)  | 
获取输入
1  | variable=$(whiptail --title "" --inputbox "Variable:" 0 0 3>&1 1>&2 2>&3)  | 
获取密码
1  | PASSWORD=$(whiptail --title "Password" --passwordbox "Enter your password:" 0 0 3>&1 1>&2 2>&3)  | 
显示选择菜单
1  | OPTION=$(whiptail --title "" --menu "Choose your option:" 0 0 0 \  | 
进行单选
1  | OPTION=$(whiptail --title "" --radiolist "Choose your option:" 0 0 0 \  | 
进行多选
1  | OPTIONS=$(whiptail --title "" --checklist \  | 
进度条
1  | for i in $(seq 1 100); do  | 
Zenity
zenity是由GNOME团队开发的,通过脚本唤醒GTK下的GUI的工具。
安装
1  | # Debian  | 
用法
zenity的语法为:zenity [选项] --title "标题" --控件类型 [控件选项]
在窗口中,选择OK或Yes,zenity返回0,选择Cancel或关闭窗口,zenity返回1。
zenity的选择与输入结果通过标准输出流打印,分割符默认为|,要将结果保存到变量,只需要通过变量名=$(zenity ...)即可,对于列表变量,还要通过($变量名)将其转换为数组变量。
选项
选项有以下几项:
1  | --window-icon # 指定图标路径,否则使用默认图标  | 
控件
| 类型 | 选项 | 含义 | 
|---|---|---|
| 进度框 | --progress [--text "描述" --percentage 初始值 --auto-close --auto-kill --pulsate --no-cancel] | 
显示一个进度条,--auto-close在完成时自动关闭,--auto-kill允许点击Cancel强制杀死,--pulsate不显示具体进度,--no-cancel不显示Cancel按钮 | 
| 输入框 | --entry [--text "描述" --entry-text "初始文本" --hide-text] | 
允许用户输入文本,将输入内容打印到标准输出,--hide-text表示隐藏输入的文字 | 
| 密码框 | --password [--username] | 
类似于输入框,但是不在窗口中显示输入内容 | 
| 文本框 | --text --filename "打开文件" --editable --checkbox --ok-label "OK按钮内容" --cancel-label "Cancel按钮内容" | 
显示一个文件内容让用户阅读,--editable启用文本编辑,--checkbox让用户确认阅读 | 
| 消息框 | --info [--text "描述" --no-wrap] | 
显示普通的信息框,--no-wrap表示文字不换行 | 
| 警告框 | --warning [--text "描述" --no-wrap] | 
显示带有叹号的警告框,--no-wrap表示文字不换行 | 
| 错误框 | --error [--text "描述" --no-wrap] | 
显示带有巨大叉号的错误框,--no-wrap表示文字不换行 | 
| 询问框 | --question [--text "描述" --no-wrap --ok-label "OK按钮内容" --cancel-label "Cancel按钮内容"] | 
显示一个是否对话框,让用户进行选择,是则返回0,否则返回1 | 
| 选择框 | --list --checklist/--radiolist [--separator "分割符" --hide-header] --column "列标题" 列内容 | 
显示一个列表,让用户选择列表中的选项,打印选择的选项内容到标准输出,--radiolist单选框,--checklist多选框,--hide-header隐藏列标题 | 
| 表单框 | --forms --add-entry "条目名" [--add-password "条目名" --add-calendar "条目名" --text "描述" --separator "分割符" --forms-date-format "日期格式"] | 
显示一个让用户进行填写的表单,收集填写的内容并打印到标准输出 | 
| 通知框 | --notification --text "描述" | 
显示一条系统通知 | 
| 日历框 | --calendar [--text "描述" --day 初始天 --month 初始月 --year 初始年 --date-format "返回日期格式"] | 
显示一个日历,让用户选择日期,日期按照指定的格式打印到标准输出 | 
| 滑动条框 | --scale [--text "描述" --value "初始值" --min-value "最小值" --max-value "最大值" --step "步长" --print-partial --hide-value] | 
显示一个滑动条,让用户选择数值,--print-partial显示小数,--hide-value隐藏数字 | 
| 取色框 | --color-selection [--color "初始颜色" --show-palette] | 
显示一个取色器,让用户选择一种颜色,--show-palette使用调色板进行选择 | 
| 文件选择框 | --file-selection [--filename 初始文件路径 --multiple --separator "分割符" --directory --save --confirm-overwrite --file-filter "模式"] | 
让用户选择文件,路径打印到标准输出,--multiple表示启用多选,--separator指定多选分割符,--save表示保存模式,--confirm-overwrite表示覆盖前确认,--file-filter指定文件名的过滤模式 | 
发送通知
除了使用zenity --notification之外,还可以使用Libnotify。
安装Libnotify:
1  | # Debian  | 
使用notify-send [选项] "标题" ["内容"]发送系统通知,选项如下:
1  | -u|--urgency # 紧急度,可选low|normal|critical  |