【发布时间】:2018-07-20 12:55:14
【问题描述】:
我在这里编写了一个相当简单的脚本,旨在使用zenity 显示一个文本信息对话框,并不断地从远程 TCP 连接读取数据并将其显示在对话框中。这行得通...但是,如果我关闭zenity 对话框,我希望整个脚本终止。
有没有办法做到这一点?我认为我无法检查 while 循环中的任何内容,因为脚本可能会在从远程 TCP 连接读取数据时停止。
#!/bin/bash
on_exit() {
zenity --display=:0 --error --text="Script has exited." &
}
# Options
while getopts "a:p:t:" OPTION; do case "$OPTION" in
a) address="$OPTARG";;
p) port="$OPTARG";;
t) title="$OPTARG";;
esac; done
exec &> >(zenity --display=:0 --text-info --title=$title || exit)
# doesn't make a difference? ↑
# also tried &&
trap "on_exit" EXIT
while read data < /dev/tcp/$address/$port; do
echo $data
# ...
# do some other stuff with the information
# ...
done
注意:这将在 IGEL Linux 上运行。我没有安装其他软件包的选项。所以,理想情况下,我正在寻找的解决方案是 Bash 原生的。
更新
我只需进行此修改即可继续使用exec。或者@BachLien 使用命名管道的回答也有效。
PID=$$
exec &> >(zenity --display=:0 --text-info --title=$title; kill $PID)
【问题讨论】:
-
是否可以将 Zenity 执行放在一个等待其终止并随后杀死目标脚本的包装器中?
-
在
>(...)内部调用exit意味着退出子shell。您需要kill父 PID 来终止父 shell。请考虑使用命名管道(我相信不需要安装任何额外的东西)以便于编码。