我正在使用 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
有人遇到过这个问题吗?我该如何解决?谢谢。
这是一个建议(为了可读性使用反斜杠):
#! /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
。
希望有帮助。