在 zenity 进度窗口上单击“取消”后如何停止 bash 脚本

问题描述 投票:0回答:1

我正在使用 bash 脚本编写一个脚本,在这段代码中我有一个与 zenity 进度条一起运行的进程。发生的情况是,当我运行它并尝试取消操作时,它将继续运行,直到我在 Linux 终端上点击 ctrl+c,这意味着取消操作。由于我是为非程序员的用户执行此操作,因此这不能成为阻止它的方法。

这就是我正在谈论的台词:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH sOutputFile="$DESTINO.pdf" "$FILE" | zenity --progress --title="Processando" --auto-close --width=220 --text="Comprimindo PDF" --pulsate --percentage=0 

我认为我已经找到了解决这个问题的答案,因为我在其他 zenity 窗口中使用了它,例如这个:

zenity --width=600 --height=300 --text-info --title="Test" --filename=/tmp/original.txt --editable > /tmp/changed.txt
case $? in
    1)
        exit
    ;;
esac

它工作得很好,当我单击“取消”时,它会停止脚本,但是当我尝试在使用 gs 命令运行的进度栏中使用它时,它不起作用,zenity 窗口关闭,但脚本继续运行。 这就是我尝试解决它的方法:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$DESTINO.pdf" "$FILE" | zenity --progress --title="Processando" --auto-close --width=220 --text="Comprimindo PDF" --pulsate --percentage=0 
case $? in
    1)
        exit
        ;;
esac

有人遇到过这个问题吗?我该如何解决?谢谢。

linux bash shell bin zenity
1个回答
0
投票

这是一个建议(为了可读性使用反斜杠):

#! /bin/sh

hup_handler()
  {
  kill -s KILL "$!"
  }

trap hup_handler HUP

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook \
   -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$DESTINO.pdf" "$FILE"   \
| zenity --progress --title="Processando" --auto-close --auto-kill \
         --width=220 --text="Comprimindo PDF" --pulsate --percentage=0 &
wait

echo 'end of script'

显然,当按下“取消”按钮时,

zenity --progress --auto-kill
会向父进程发送HANGUP信号。由于某种超出我所知的原因,该信号仅在管道完成时才会被处理,除非您将其放置在后台并使用
&

如果您想在用户点击“取消”按钮时删除文件,您可以在

rm -f "$DESTINO.pdf"
函数中添加
hup_handler

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.