我正在寻找创建一个基于终端的环境来适应我的重击脚本写入.我希望它看起来像这样:
答案1
dialog --backtitle "Package configuration" \
--title "Configuration sun-java-jre" \
--yesno "\nBla bla bla...\n\nDo you accept?" 10 30
用户响应存储在退出代码中,因此可以照常打印:(echo $?
请注意,这0
意味着“是”,而1
在 shell 世界中则意味着“否”)。
关于评论区的其他问题:
要将某些命令的输出放入对话框中,只需使用命令替换机制
$()
,例如:dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
为了给用户多种选择,您可以使用
--menu
option 而不是--yesno
要将用户选择的输出存储到变量中,需要使用
--stdout
选项或通过--output-fd
或手动更改输出描述符,例如: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"
需要这个技巧是因为
dialog
默认情况下输出到 stderr,而不是 stdout。
一如既往,man dialog
是你的朋友。
答案2
问题中的屏幕截图看起来像鞭尾(一个功能简化的程序,模仿对话,使用蝾螈而不是恩诅咒)。标题和按钮的呈现方式内置于每个程序中,使它们看起来不同。
这是一个复制原始屏幕截图的脚本,适用于鞭尾或对话框:
#!/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))
为了进行比较,请使用鞭尾截图:
并带有对话框:
除了标题和按钮的不同外观之外,对话框默认使用不同的颜色(尽管这是可配置的 -看截图),并且屏幕上使用的线条更少。
对话框(和whiptail)使用库来管理线条、颜色等的显示。但是您也可能会看到红帽anaconda程序中使用newt作为共享库,从Python(具有相同的外观)。同样,内核配置程序最初是作为对话框的(删减)副本,然后演变成使用共享库(没有原始程序lxdialog
)的功能,就像在 python 中使用 newt 的方式一样。
在 bash 中,您可以使用dialog 或whiptail 来实现最常用的功能。有人写了一个这些的包装器(在 Perl 中)允许脚本更容易地使用这些或其他一些,但最好直接使用对话框,因为 perl 模块本质上是共同点。
对话框源包括所有小部件的示例以及大多数命令行选项:
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.
进一步阅读:
答案3
我相信您正在寻找的包是恩诅咒。
维基百科ncurses 描述如下:
ncurses(新的curses)是一个编程库,提供API,允许程序员以独立于终端的方式编写基于文本的用户界面。它是一个用于开发在终端仿真器下运行的“类GUI”应用软件的工具包
由于您使用的是 bash,因此可以使用Bash 简单的诅咒(正如 Runium 在下面的评论中提到的)。
答案4
禅宗
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)
# 帮助
zenity --help
zenity --help-general
zenity --help-entry
其他图形用户界面 (gui)
dialog
dialog \
--backtitle "backtitle" \
--title "title" \
--yesno \
"bla bla bla...\n\n Do you accept?" \
0 -1
echo $?
停止进一步执行脚本,中断它。命令回显 $? , 永远不会发生