从 Linux 终端发送桌面通知和提醒
本 Linux 教程演示了如何使用脚本命令向自己发送桌面通知和提醒。
有时从脚本中获取视觉反馈很有用。例如,当脚本或 cron 作业完成时、长时间运行的构建失败或脚本执行期间出现紧急问题。桌面应用程序可以通过弹出通知来完成此操作,但也可以通过脚本来完成!您可以使用脚本命令向自己发送桌面通知和提醒。
(托马斯·瓦拉克萨,CC BY-SA 4.0)
以下代码已在 Linux 上编写并测试。只需付出一些努力,也可以在 macOS 上完成。请参阅最后一节以获取一些提示和技巧。
从 Linux 终端发送通知
要从 Linux 终端发送通知,请使用 notify-send
命令。它通常已作为桌面的一部分安装,但您可以运行 which
notify-send
进行确认。如果尚未安装,请使用您选择的包管理器进行安装。
在 Fedora 和类似发行版上,输入:
$ sudo dnf install libnotify
在基于 Debian 的发行版上,输入:
$ sudo apt install notify-send
一些简单通知的示例:
$ notify-send "Dinner ready!"
$ notify-send "Tip of the Day" "How about a nap?"
您可以使用紧急级别、自定义图标等选项自定义通知。通过 man notification-send
了解更多信息。您可以在通知正文中使用一小组 HTML 标记,让您的消息更加美观。最重要的是,URL 被呈现为可点击的。例如:
$ notify-send -u critical \
"Build failed!" \
"There were <b>123</b> errors. Click here to see the results: http://buildserver/latest"
(托马斯·瓦拉克萨,CC BY-SA 4.0)
发送的通知由桌面环境拾取并像任何其他通知一样显示。他们将具有相同一致的外观、感觉和行为。
将通知发送与 at 结合起来
Cron 通常用于定期安排命令。 at
命令安排在指定时间单次执行命令。如果您像这样运行它,它将以交互模式启动,您可以在其中输入要在给定时间执行的命令:
$ at 12:00
这对于脚本来说没有用。幸运的是,at
接受来自标准输入的参数,以便我们可以这样使用它:
$ echo "npm run build" | at now + 1 minute
$ echo "backup-db" | at 13:00
指定时间的方法有很多种。从绝对时间(例如 10:00
)到相对时间(例如 now + 2 小时
),再到特殊时间(例如 noon
或 ) >午夜
。我们可以将它与 notify-send
结合起来,在将来的某个时间向自己显示提醒。例如:
$ echo "notify-send 'Stop it and go home now?' 'Enough work for today.' -u critical" | at now
(托马斯·瓦拉克萨,CC BY-SA 4.0)
提醒命令
现在,构建一个自定义 Bash 命令来向自己发送提醒。像这样简单且人性化的事情怎么样:
$ remind "I'm still here" now
$ remind "Time to wake up!" in 5 minutes
$ remind "Dinner" in 1 hour
$ remind "Take a break" at noon
$ remind "It's Friday pints time!" at 17:00
这比 Alexa 更好!如何获得这份善意呢?
请参阅下面的代码。它定义了一个名为remind的shell函数,它支持上述语法。实际工作是在最后两行完成的。其余部分负责帮助、参数验证等,这大致匹配任何大型应用程序中有用代码与必要白噪声的比例。
将代码保存在某个位置,例如在 ~/bin/remind
文件中,并在 .bashrc
配置文件中获取该函数,以便在您登录时加载它:
$ source ~/bin/remind
重新加载终端,然后输入提醒以查看语法。享受!
#!/usr/bin/env bash
function remind () {
local COUNT="$#"
local COMMAND="$1"
local MESSAGE="$1"
local OP="$2"
shift 2
local WHEN="$@"
# Display help if no parameters or help command
if [[ $COUNT -eq 0 || "$COMMAND" == "help" || "$COMMAND" == "--help" || "$COMMAND" == "-h" ]]; then
echo "COMMAND"
echo " remind <message> <time>"
echo " remind <command>"
echo
echo "DESCRIPTION"
echo " Displays notification at specified time"
echo
echo "EXAMPLES"
echo ' remind "Hi there" now'
echo ' remind "Time to wake up" in 5 minutes'
echo ' remind "Dinner" in 1 hour'
echo ' remind "Take a break" at noon'
echo ' remind "Are you ready?" at 13:00'
echo ' remind list'
echo ' remind clear'
echo ' remind help'
echo
return
fi
# Check presence of AT command
if ! which at >/dev/null; then
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'."
return
fi
# Run commands: list, clear
if [[ $COUNT -eq 1 ]]; then
if [[ "$COMMAND" == "list" ]]; then
at -l
elif [[ "$COMMAND" == "clear" ]]; then
at -r $(atq | cut -f1)
else
echo "remind: unknown command $COMMAND. Type 'remind' without any parameters to see syntax."
fi
return
fi
# Determine time of notification
if [[ "$OP" == "in" ]]; then
local TIME="now + $WHEN"
elif [[ "$OP" == "at" ]]; then
local TIME="$WHEN"
elif [[ "$OP" == "now" ]]; then
local TIME="now"
else
echo "remind: invalid time operator $OP"
return
fi
# Schedule the notification
echo "notify-send '$MESSAGE' 'Reminder' -u critical" | at $TIME 2>/dev/null
echo "Notification scheduled at $TIME"
}
轻松通知
通过这几个简单的开源命令,您可以将自己的脚本、应用程序和任务与桌面集成。试试看!
经作者许可,本文改编自原始文章,可在此处找到。