Contents

在Linux的GUI中显示来自Shell脚本通知

1. 概述

如今,许多 Linux 用户希望选择GNOMEXFCEKDE 等 GUI 桌面环境作为他们的日常工作平台。但是,在 Linux 中,许多工作都是使用 shell 脚本完成的。通常,当我们启动一个 shell 脚本时,它会在 Linux 命令行中运行。

我们可以从 GUI 桌面环境启动一个 shell 脚本。但是如果我们想知道脚本是否完成了它的工作或检查执行状态,我们必须切换到脚本启动的终端或检查shell脚本的进程状态和日志文件。

在本教程中,我们将了解如何从 shell 脚本发送 GUI 通知,以便我们可以直接看到脚本是如何运行的。

2. 一个Shell脚本示例

为了解决和演示来自 shell 脚本的 GUI 通知,我们将首先创建一个简单的 shell 脚本作为示例。

假设我们想通过执行一个名为tell_me_ip.sh的 shell 脚本来知道我们的公共 IP 地址:

#!/bin/bash
IP_MSG="$(curl --no-progress-meter http://ifconfig.io 2>&1)"
STATUS=$?
if [ $STATUS -ne 0 ]; then
    MESSAGE="Error Occurred! [ $IP_MSG ]"
else
    MESSAGE="My Public IP: $IP_MSG"
fi
echo $MESSAGE

脚本非常简单。让我们快速浏览一下。

首先,我们使用curl 命令读取网站ifconfig 来获取我们的公共 IP 地址。

在这里,我们通过设置选项*–no-progress-meter告诉curl*命令抑制进度表输出。

其次,根据curl命令的退出代码,我们使用 IP 地址或错误消息构建消息。

最后,我们将消息打印出来。

让我们快速测试一下脚本:

$ ./tell_me_ip.sh
My Public IP: 149.224.212.24

为了模拟错误情况,让我们简单地将tell_me_ip.sh脚本中的网站URL 更改为不存在的URL,例如“ http://who.is.it ”:

$ ./tell_me_ip.sh
Error Occurred! [ curl: (6) Could not resolve host: who.is.it ]

好的!我们的 shell 脚本有效。

接下来,让我们看看是否可以将消息作为通知发送到我们的 GUI 桌面环境。

3. 使用notify-send命令

大多数现代 GUI 桌面环境将在登录时自动启动通知服务器,以接收不同应用程序通过D-Bus 发送的通知。

libnotify 是 桌面通知规范 的实现。它被广泛使用并且独立于桌面。

libnotify软件包附带一个 notify-send命令。我们可以使用它轻松地将 shell 脚本中的通知发送到 GUI 桌面。

3.1. 简而言之,notify-send

使用notify-send命令的语法非常直观:

notify-send [OPTIONS] [Message Summary] [Message Body]

[Message Body]支持基于 XML 的标记。它是 HTML 的一个小子集以及一些额外的标签。

让我们看一些常用的例子:

  • *Hello World*将以粗体显示Hello World
  • * Hello World*将以斜体显示消息:Hello World
  • * Hello World*将在消息下划线:Hello World

notify-send命令支持控制通知显示方式的选项。 让我们看几个非常有用的选项:

  • -t Number:定义通知出现在桌面屏幕上的持续时间(以毫秒为单位)
  • -i Icon_Name : 指定一个图标名称与消息一起显示在通知中

让我们从命令行发送一个“Hello World”通知:

 notify-send -t 3000 -i face-smile "The First Notification" "Hello <b>World</b>"

如果我们运行上面的命令,一个带有快乐笑脸图标的通知将在通知区域显示三秒钟:

/uploads/script_gui_notification/1.png

除了笑脸,notify-send命令还支持许多其他图标

3.2. 从我们的 Shell 脚本发送通知

现在,是时候在我们的 shell 脚本中组合notify-send命令来发送桌面通知了:

#!/bin/bash 
IP_MSG="$(curl --no-progress-meter http://ifconfig.io 2>&1)" 
STATUS=$? 
ICON="dialog-information"
if [ $STATUS -ne 0 ]; then
    MESSAGE="Error Occurred! [ $IP_MSG ]" 
    ICON="dialog-error"
else
    MESSAGE="My Public IP: $IP_MSG" 
fi
notify-send -t 4000 -i "$ICON" "Public IP" "$MESSAGE"
echo $MESSAGE

我们稍微修改了原始脚本。

我们添加了一个*$ICON*变量来存储通知图标名称,因为我们希望看到成功和错误情况的不同图标。

此外,我们添加了一个notify-send命令来将通知发送到桌面。

最后,让我们测试一下我们的 shell 脚本:

/uploads/script_gui_notification/2.png

让我们更改网站的 URL 并快速测试错误案例:

/uploads/script_gui_notification/3.png

酷!现在我们的 shell 脚本可以将其执行状态发送到我们的 GUI 桌面。

4. 使用zenity实用程序

zenity 一个在命令行和 shell 脚本中显示 GTK 对话框的实用程序。如果我们想显示Qt GUI 元素,我们可以使用*qarama *,一个“用于 Qt 的 Zenity 克隆”。

在本教程中,我们将只讨论如何使用 zenity发送 GTK 通知。

4.1. 简而言之zenity

zenity 可以显示桌面通知和其他类型的 GTK 对话框——例如,信息对话框、错误警报、日历对话框、复选框和单选按钮。

使用zenity命令的语法很简单:

zenity [Options]

[Options]定义了我们希望zenity为我们做的一切。例如,我们可以告诉它我们想要显示什么样的 GUI 对话框,如何排列对话框中的元素,或者如何在 GUI 对话框和我们的 shell 脚本之间传输数据。

毕竟,我们不想设计一个功能齐全的 GTK 应用程序。相反,我们的目标只是将 shell 脚本中生成的信息显示到 GUI 桌面。

因此,有几个选项对我们来说很有趣:

  • –info : 显示信息对话框
  • –error : 显示错误对话框
  • –text=STRING : 设置对话框文本
  • –notification:显示桌面通知

要了解zenity的工作原理,让我们使用zenity命令编写几个“Hello World”示例。

首先,让我们创建一个带有“Hello World”消息的桌面通知:

zenity --notification --window-icon=info --text "Hello World"

如果我们执行上面的命令,将会出现一个通知:

/uploads/script_gui_notification/4.png

我们应该记住,当我们显示一个通知时,带有–text*选项的文本不支持标记。*

此外,我们可以显示信息或错误对话框来包含我们的“Hello World”消息。让我们使用这个命令创建一个错误对话框:

zenity --error --text "Hello World"

/uploads/script_gui_notification/5.png

**当对话框中显示消息时,我们可以选择文本或复制它。**在某些情况下,这可能很方便。

但是,与通知弹出窗口不同,信息或错误对话框将阻止 shell 脚本。换句话说,一旦我们单击“确定”按钮,shell 脚本将继续执行。

4.2. 从我们的 Shell 脚本显示对话框和通知

现在,让我们在 tell_me_ip.sh脚本中添加zenity

如果我们成功获取公共 IP,我们将在信息对话框中将其显示为消息。这样,我们就可以轻松复制IP地址了。但是如果发生错误,我们希望通过通知得到通知:

#!/bin/bash 
IP_MSG="$(curl --no-progress-meter http://ifconfig.io 2>&1)"
STATUS=$? 
if [ $STATUS -ne 0 ]; then
    MESSAGE="Error Occurred! [ $IP_MSG ]"
    zenity --notification --window-icon=error --text="$MESSAGE"
else
    MESSAGE="My Public IP: $IP_MSG"
    zenity --info --text="$MESSAGE"
fi
echo $MESSAGE

如果我们执行 shell 脚本,我们的公共 IP 地址将显示在信息对话框中。我们可以用鼠标选择IP地址:

/uploads/script_gui_notification/6.png

一旦我们单击“确定”按钮,shell 脚本的执行将继续,并打印 IP 地址。

如果我们将脚本中的 URL 更改为http://who.is.it 并再次启动脚本,我们将看到带有详细错误消息的错误通知:

/uploads/script_gui_notification/7.png