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 |