返回

Zenity进度窗口中如何单击“取消”后停止Bash脚本?

Linux

如何在 Zenity 进度窗口中单击“取消”后停止 Bash 脚本

作为一名经验丰富的程序员,我经常使用 Zenity 来在 Bash 脚本中创建进度条。然而,我遇到了一个问题,即脚本在单击“取消”按钮后无法停止运行。为了解决这个问题,我进行了深入研究并找到了一个有效的解决方案,下面将详细介绍。

问题:脚本在单击“取消”后无法停止运行

当我在脚本中使用 Zenity 进度条时,我发现即使用户单击了“取消”按钮,脚本仍会继续运行,直到我在终端中按 Ctrl+C。这表明 Zenity 和 Bash 脚本之间存在通信问题,导致脚本无法从 Zenity 接收取消信号。

解决方案:使用 --cancel-button 选项

解决此问题的方法是使用 Zenity 提供的 --cancel-button 选项。此选项允许我们在 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 --cancel-button="Cancelar"

解释:

通过添加 --cancel-button="Cancelar" 选项,我们创建了一个名为“Cancelar”的取消按钮。当用户单击此按钮时,它将向脚本发送 SIGINT 信号,该信号通常由 Ctrl+C 发送。通过使用 --cancel-button 选项,我们建立了 Zenity 和 Bash 脚本之间的通信渠道,允许脚本在用户单击“取消”时收到取消信号并停止运行。

其他提示:

  • 确保使用最新版本的 Zenity,因为它提供了更完善的取消处理功能。
  • 在脚本中,你还可以使用 trap 语句捕获 SIGINT 信号并相应地停止脚本。

结论:

使用 --cancel-button 选项可以轻松地在 Zenity 进度条中添加取消功能。通过实现此功能,我们可以确保脚本在用户单击“取消”按钮时停止运行,从而提供更好的用户体验。

常见问题解答:

1. 为什么单击“取消”后脚本无法停止运行?

Zenity 和脚本之间存在通信问题,导致脚本无法从 Zenity 接收取消信号。

2. 如何在脚本中捕获取消信号?

可以使用 trap 语句在脚本中捕获 SIGINT 信号并相应地停止脚本。

3. --cancel-button 选项有哪些其他用途?

--cancel-button 选项还可用于其他用途,例如在脚本中创建自定义取消按钮或指定取消按钮的文本。

4. 除了 --cancel-button 选项之外,还有什么其他方法可以停止 Zenity 进度条?

如果由于某种原因无法使用 --cancel-button 选项,则可以通过向 Zenity 进程发送 SIGINT 信号来停止进度条。

5. 如何使用 Zenity 进度条显示进度?

Zenity 进度条可以通过 --progress 选项启用。它允许你指定标题、文本、脉冲和百分比来显示进度。