皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

如何从 Linux 终端发送桌面通知与提醒

这篇教程演示如何使用脚本命令来发送自己的桌面通知与提醒。

有时候,来自脚本的视觉回馈是很有用的。例如,当一个脚本或计划任务完成时,一个长期运行的构建任务失败时,或者当脚本执行中出现了紧急问题时。桌面应用程序可以通过弹出通知来做到这一点,但脚本也可以做到这一点!你可以使用脚本命令来给自己发送桌面通知与提醒。

如何从 Linux 终端发送桌面通知与提醒

Example notification

下面的代码是在 Linux 上编写和测试的。它也可以在 macOS 上运行,只需花点功夫。请参见最后一节 提示与技巧

从 Linux 终端发送通知

要从 Linux 终端发送通知,请使用 notify-send 命令。运行 which notify-send 命令来查看它是否在于你的系统中。如果没有,请使用包管理器来安装它。

在 Fedora 上,输入:

  1. $ sudo dnf install notify-send

在基于 Debian 的发行版上,输入:

  1. $ sudo apt install notify-send

几个简单的通知示例:

  1. $ notify-send "Dinner ready!"
  2. $ notify-send "Tip of the Day" "How about a nap?"

你可以用紧急程度、自定义图标等选项来自定义通知。过 man notify-send 了解更多。你也可以在通知正文中使用一小组 HTML 标记,以使消息有一个棒的视觉感受。最重要的是,URL 被呈现为可点击的。例如:

  1. $ notify-send -u critical \
  2. "Build failed!" \
  3. "There were <b>123</b> errors. Click here to see the results: http://buildserver/latest"

如何从 Linux 终端发送桌面通知与提醒

Build fail notification

发送的通知会被桌面环境接收,并像其他通知一样显示。它们将具有相同的外观、交互和行为。

将 notify-send 与 at 结合使用

计划任务通常被用来定期安排命令。at 命令安排在一个指定的时间执行一条命令。如果你像这样运行它,它会以交互模式启动,你可以在其中输入要在指定时间执行的命令:

  1. $ at 12:00

这对脚本来说并不有用。幸运的是 at 接受来自标准输入的参数,所以我们可以这样使用它:

  1. $ echo "npm run build" | at now + 1 minute
  2. $ echo "backup-db" | at 13:00

有许多指定时间的方法。 从绝对时间,如 10:00,到相对时间,如 now + 2 hours ,再特殊时间,如noon 或 midnight。我们可以把它和 notify-send 结合起来,在未来的某个时间向自己发送提醒。例如:

  1. $ echo "notify-send 'Stop it and go home now?' 'Enough work for today.' -u critical" | at now

如何从 Linux 终端发送桌面通知与提醒

Stop for the day notification

提醒的命令

现在,建立一个自定义的 Bash 命令来给自己发送提醒信息。像这样简单且人性化的命令:

  1. $ remind "I'm still here" now
  2. $ remind "Time to wake up!" in 5 minutes
  3. $ remind "Dinner" in 1 hour
  4. $ remind "Take a break" at noon
  5. $ remind "It's Friday pints time!" at 17:00

这比 Alexa 更好!该怎样做?

请看下面的代码。它定义了一个名为 remind 的函数,它支持上述语法。实际工作是在最后两行完成的。其余的部分负责显示帮助信息、参数校验等,这与任何大型应用程序中有用的代码与必要的白噪声的比例大致相同。

把代码保存在某个地方,例如,在 ~/bin/remind 文件中,并在你的 .bashrc 配置文件写入该函数,以便在你登录时加载它:

  1. $ source ~/bin/remind

重新打开终端,然后输入 remind 来查看语法。尽情享受吧!

  1. #!/usr/bin/env bash
  2. function remind () {
  3.   local COUNT="$#"
  4.   local COMMAND="$1"
  5.   local MESSAGE="$1"
  6.   local OP="$2"
  7.   shift 2
  8.   local WHEN="$@"
  9.   # Display help if no parameters or help command
  10.   if [[ $COUNT -eq 0 || "$COMMAND" == "help" || "$COMMAND" == "--help" || "$COMMAND" == "-h" ]]; then
  11.     echo "COMMAND"
  12.     echo "    remind &lt;message&gt; &lt;time&gt;"
  13.     echo "    remind &lt;command&gt;"
  14.     echo
  15.     echo "DESCRIPTION"
  16.     echo "    Displays notification at specified time"
  17.     echo
  18.     echo "EXAMPLES"
  19.     echo '    remind "Hi there" now'
  20.     echo '    remind "Time to wake up" in 5 minutes'
  21.     echo '    remind "Dinner" in 1 hour'
  22.     echo '    remind "Take a break" at noon'
  23.     echo '    remind "Are you ready?" at 13:00'
  24.     echo '    remind list'
  25.     echo '    remind clear'
  26.     echo '    remind help'
  27.     echo
  28.     return
  29.   fi
  30.   # Check presence of AT command
  31.   if ! which at &gt;/dev/null; then
  32.     echo "remind: AT utility is required but not installed on your system. Install it with your package manager of choice, for example 'sudo apt install at'."
  33.     return
  34.   fi
  35.   # Run commands: list, clear
  36.   if [[ $COUNT -eq 1 ]]; then
  37.     if [[ "$COMMAND" == "list" ]]; then
  38.       at -l
  39.     elif [[ "$COMMAND" == "clear" ]]; then
  40.       at -r $(atq | cut -f1)
  41.     else
  42.       echo "remind: unknown command $COMMAND. Type 'remind' without any parameters to see syntax."
  43.     fi
  44.     return
  45.   fi
  46.   # Determine time of notification
  47.   if [[ "$OP" == "in" ]]; then
  48.     local TIME="now + $WHEN"
  49.   elif [[ "$OP" == "at" ]]; then
  50.     local TIME="$WHEN"
  51.   elif [[ "$OP" == "now" ]]; then
  52.     local TIME="now"
  53.   else
  54.     echo "remind: invalid time operator $OP"
  55.     return
  56.   fi
  57.   # Schedule the notification
  58.   echo "notify-send '$MESSAGE' 'Reminder' -u critical" | at $TIME 2&gt;/dev/null
  59.   echo "Notification scheduled at $TIME"
  60. }

简单的提醒

通过这几个简单的开源命令,你可以将你自己的脚本、应用程序和任务与你的桌面结合起来。试一试吧!


(文内图片来自 Tomasz Waraksa, CC BY-SA 4.0)

本文经作者许可改编自 原文


via: https://opensource.com/article/22/1/linux-desktop-notifications

作者:Tomasz Waraksa 选题:lujun9972 译者:mcfd 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

转自 技术|如何从 Linux 终端发送桌面通知与提醒