gpt4 book ai didi

bash - 当后台 zenity 对话框关闭时使脚本终止

转载 作者:行者123 更新时间:2023-11-29 09:15:03 25 4
gpt4 key购买 nike

我在这里编写了一个相当简单的脚本,旨在使用 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,所以我尝试了这个脚本来说明这个想法。

程序terminal+cat(模拟zenity)由后台运行的函数_dspMsg执行(子进程); cat 连续显示来自文件 ($m) 的消息,该文件是命名管道;当 terminal+cat 退出时,父进程被kill

与此同时,另一个 cat 进程将消息写入管道 $m(模拟 TPC 信息源);当 _dspMsg 退出时它会被杀死。

#!/bin/bash
# 1) named pipe
m=`mktemp -u /tmp/msg-XXXX=` # get a temporary filename (for named pipe)
mkfifo "$m" # create that named pipe
trap "echo END; rm $m" EXIT # remove that file when exit
# 2) zenity
_dspMsg(){ # continuously display messages
urxvt -e bash -c "cat <$m" # terminal+cat is used in place of zenity
kill $1 # kill parent pid
} # to be run in background
_dspMsg $$ & # $$ = proccess id
# 3) TCP info feeds
cat >>"$m" # feeding messages using cat
# cat is used in placed of TCP data feed

注意:

  1. 命名管道用作父进程和子进程之间的通信方式。
  2. 要测试该脚本,您可能需要将 urxvt 更改为 xtermiTerm 或您计算机上可用的任何其他终端仿真器。

所以,也许这就是您所需要的(未经测试):

#!/bin/bash

while getopts "a:p:t:" OPTION; do case "$OPTION" in
a) address="$OPTARG";;
p) port="$OPTARG";;
t) title="$OPTARG";;
esac; done

m=`mktemp -u /tmp/msg-XXXX=`
mkfifo "$m"
trap "zenity --display=:0 --error --text='Script has exited.' & rm $m" EXIT

_dspMsg(){
zenity --display=:0 --text-info --title="$title" <"$m"
kill $1
}

_dspMsg $$ &

while read data < /dev/tcp/$address/$port; do
echo $data >>"$m"
done

关于bash - 当后台 zenity 对话框关闭时使脚本终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48711158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com