Linux 诅咒对话框-读取清单的输出

Linux 诅咒对话框-读取清单的输出,linux,bash,shell,dialog,curses,Linux,Bash,Shell,Dialog,Curses,我正在使用bash上的dialog(使用诅咒)为一个程序制作安装程序。我制作了一份带有可用软件包列表的清单。我试图通过管道将输出传输到grep,以识别所选的软件包,并安装它们。然而,在我退出对话框之后,它把命令行搞乱了。我看不清我在输入什么,每一行都被移动了10个字符。 下面是一个与我所做的类似的示例: dialog --backtitle "Installer" --title "Packages" --checklist "Choose pa

我正在使用
bash
上的
dialog
(使用诅咒)为一个程序制作安装程序。我制作了一份带有可用软件包列表的
清单
。我试图通过管道将输出传输到
grep
,以识别所选的软件包,并安装它们。然而,在我退出
对话框之后,它把命令行搞乱了。我看不清我在输入什么,每一行都被移动了10个字符。
下面是一个与我所做的类似的示例:

dialog --backtitle "Installer" --title "Packages" --checklist "Choose packages to install:" 90 30 30 \
1 "Option 1" on \
2 "Option 2" on \
3 "option 3" off \
| grep

clear


默认情况下,
对话框
检查表会将所选标记写入标准错误,以空格分隔。只要您坚持使用单字标记(如示例中的数字),读取它们以供以后使用的一种方法是使用命令替换,首先将标准错误重定向到标准输出,然后将标准输出更改为
/dev/tty
,以便
对话框
仍能正常工作(有关详细信息,请参阅),并将标记存储在一个数组中:

#/usr/bin/env bash
声明-a选项=($(对话框)\
--背景标题“安装程序”\
--标题“包裹”\
--检查表“选择要安装的软件包:”90 30\
1“选项1”打开\
2“选项2”打开\
3“选项3”关闭(2>&1>/dev/tty))
对于“${choices[@]}”中的sel;做
中的案例“$sel”
1) 回显“选择选项1”;;
2) 回显“选择选项2”;;
3) 回显“选择选项3”;;
*)回声“未知选项!”;;
以撒
完成
您还可以使用
--separate output
选项使其每行写入一个标记,如果您的标记包含空格,或者如果您的目标是
sh
,而不是
bash
,因此没有数组,则可以更容易地使用该选项


从一系列选项动态构建清单的变体(因为您说您有很多选项):

#/usr/bin/env bash
声明-a选项=(“选项1”“选项2”“选项3”)
declare-a cmd=(对话框--backtitle安装程序--标题包--无标记
--检查表“选择要安装的软件包”90(30)
选择加入“${!选项[@]}”;做
cmd+=(“$opt”“${options[$opt]}”关闭)
完成
声明-a选项=($(“${cmd[@]}”2>&1>/dev/tty))
对于“${choices[@]}”中的sel;做
printf“已选择标记%d值%s\n”“$sel”“${options[$sel]}”
完成

对话框
将打印出所选的项目编号,以空格分隔。因此,对于该示例中的默认值,
12
。不确定你想通过使用grep实现什么…@Shawn我以为
dialog
会将清单选项输出为字符串…你没有尝试单独运行对话框部分吗?(注意:
--检查表
将结果写入标准错误,而不是标准输出)但是,我如何从
标准错误
中提取(可以说)该信息?
read
命令只读取
stdin
。我不想重复这些选项,因为我的脚本上有40个em。我想静静地做。@DepthsDoes做你需要做的一切。只是为了演示而回显它们。另外,如果我选择了多个包怎么办?我将如何实现它?不需要临时文件的新版本——这就是返回标记上的循环的目的。我没有要求这样做,我问我如何实现多个选定的包。