我将创建一个使用用户输入的脚本,所以我决定使用whiptail.
但是现在我有点困惑哪个是可移植的并且可以在 Ubuntu 10.x 及更高版本和 CentOS 5.x 及更高版本上运行。
我知道read,但我想要一个像dialog. 如果有人知道任何替代方案,请告诉我。
我有两个文件,client.sh和server.sh. 所有必要的数据都在服务器上,这些数据使用netcat发送到客户端。客户端只是获取这些数据并将其显示给最终用户。问题是,当我尝试显示从服务器到客户端的对话框加载屏幕时:
# CLIENT PORT: 8765
# SERVER PORT: 5678
while :
do
touch registered_users data
nc -vv -l -p 5678 > data
case `cat data` in
"SPLASH_SCREEN")
for ((i=0;i<100;i++))
do
echo $i
done | dialog --title 'Loading...' --gauge 'Welcome!' 8 40 0 > /dev/tcp/127.0.0.1/8765
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
# CLIENT PORT: 8765
# SERVER PORT: 5678
echo "SPLASH_SCREEN" > /dev/tcp/127.0.0.1/5678
while :
do
nc -l -p 8765 > server_response
cat server_response
done
Run Code Online (Sandbox Code Playgroud) 我正在做一个项目。对于 GUI 部分,我有两个选项。
使用dialog或zenity。
我以前从未使用过任何这些工具。我必须学习其中之一。建议我应该学习哪个,学习哪个更有益?哪个是旧的,哪个是新的?你会更喜欢哪一个?
我已经dialog安装了,我想要一个不错的进度对话框,如下所示:
+-------[ title ]--------+
| |
| +-[ console output ]-+ |
| | output line11 ^ |
| | output line12 | |
| | output line13 | |
| | output line14 # |
| | output line15 | |
| | output line16 v |
| +--------------------+ |
| #########80%#####::::: |
+------------------------+
Run Code Online (Sandbox Code Playgroud)
因此,例如,当在发行版中升级 5 个软件包时,它会显示进度(此处,4 个软件包升级了 5 个,即 80%),但会显示执行命令的详细输出。这可能吗?
我怀疑是这样,但我无法通过--tailboxbg和获得有效的解决方案--gauge。
我已经看到了很多使用对话框工具将脚本写入脚本的示例,如下所示:
trap "rm $datafile" 0 1 2 5 15
Run Code Online (Sandbox Code Playgroud)
我不明白的是SIGNAL 5的含义,好吧我知道是SIGTRAP。但我很惭愧,我仍然不明白它的真正意义......
提前致谢!!
我使用 kdialog 创建了一个 bash 脚本(它在 Kubuntu 12.04 上运行)。GUI 用于每个用户交互(在第一个之后)。但是,脚本仍然必须从终端启动并且终端仍然可见,即使用户不需要读取终端输出或在终端中输入任何内容。有没有一种简单的方法可以进入下一步并使我的 bash 脚本看起来 100% 像 KDE Gui 应用程序?
从下面 slm 和 Ilya Ananyev 的初步回答中,我看到制作 .desktop 文件可以实现这一点。这对我来说非常神奇,这就是我一直在寻找的简单答案。(我想要一个我可以在午餐时间完成的任务,并在剩下的时间里使用我的 bash 脚本来看起来像一个真正的 GUI 应用程序。).desktop 文件对于这个问题的其他读者来说也可能是正确的答案。
但是,在我的特定情况下,该脚本是一个安装程序脚本。所以我发现自己处于第 22 条军规中。如何安装 .desktop 文件以启动我的安装程序,而用户不必先为 .desktop 文件运行另一个安装程序?
此外,就我而言,该脚本由不了解计算机的最终用户使用。最终用户根据我的建议购买了一台预装了 Linux 的计算机。我的目标是让他们无需进入终端即可安装我的软件。(很可能他们以前从未见过命令提示符——他们中的一些人甚至不知道如何使用鼠标!)
所以,看起来,我的解决方案需要一些神奇的方式来安装 .desktop 文件,以便用户可以单击它来启动我的安装程序脚本。
总结一下,我的主要要求是:
Terminal=falseset完成此操作。我有以下脚本:
#!/bin/bash
set -e
TITLE="Choose version"
VERSIONS=$(cat <<'END'
AAA
BBB
END
)
VERSION_LIST=$(echo "$VERSIONS" | awk '{print NR, " ", $0}')
INDEX=$(whiptail \
--no-cancel \
--menu "$TITLE" 15 40 15 \
$VERSION_LIST \
3>&1 1>&2 2>&3)
Run Code Online (Sandbox Code Playgroud)
当我使它可执行并运行它时,它会按预期工作。当我source从 bash 或 zsh调用它时,会发生以下情况之一:
ls somefile并按下TAB以完成。我正在使用 Fedora 29,我也可以在 Mac OS 上看到这种行为。在源脚本中使用whiptail/dialog 时,是否需要考虑任何特定的考虑因素?
我想使用对话框包创建一个密码框。
#!/bin/bash
data=$(tempfile 2>/dev/null)
trap "rm -f $data" 0 1 2 5 15
dialog --title "Password" \
--clear \
--passwordbox "Enter your password" 10 30 2> $data
ret=$?
case $ret in
0)
echo "Password is $(cat $data)";;
1)
echo "Cancel pressed.";;
255)
[ -s $data ] && cat $data || echo "ESC pressed.";;
esac
Run Code Online (Sandbox Code Playgroud)
但是,当我执行它时出现此错误:
line 4: $data: ambiguous redirect
Run Code Online (Sandbox Code Playgroud)
怎么了?
我想通过 bash shell 脚本向用户显示可供选择的菜单。然后应将选择存储在环境变量中以供以后进一步使用。
如果我从命令行运行:
dialog \
--backtitle "Make a choice" \
--menu "Take a pick" \
10 40 3 \
choice1 "First choice" \
choice2 "Second choice"
Run Code Online (Sandbox Code Playgroud)
然后一切正常;我得到了我想要的菜单,choice1或者choice2打印回了我。但是,如果我运行:
SELECTION=$( dialog \
--backtitle "Make a choice" \
--menu "Take a pick" \
10 40 3 \
choice1 "First choice" \
choice2 "Second choice" \
)
Run Code Online (Sandbox Code Playgroud)
然后它不再像我想要的那样工作。
dialog按 Enter 时退出我尝试添加2>&1将 stderr 重定向到 stdout,以防它真的被打印到 stderr。唯一显着的影响是现在,无论是从命令替换表达式还是打印到终端,都不会返回任何内容。 …
dpkg-reconfigure 提供了一种以“用户友好”的方式为已安装包设置选项的方法(例如,不是编辑文件而是从对话框中选择)。
我怎样才能找出哪个包有这样的选项?例如,“ dpkg-reconfigure tzdata”确实有,而“ dpkg-reconfigure nano”没有。
apt-mirror通过dpkg-reconfigure“对话方式”添加额外的正确参数/包是什么?