Linux使用终端工具给你的电脑发送弹窗提醒!
<p><img title="Linux使用终端工具给你的电脑发送弹窗提醒!" alt="Linux使用终端工具给你的电脑发送弹窗提醒!" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/009f32b8e2668958e66bc5793d6fa2ca.jpg" width="auto"></p>
<p>
大家好,我是良许。</p>
<p>
现在人手一部智能手机,这些智能手机都有个非常实用的功能,那就是弹窗提醒。当我们收到短信,或者微信信息时,手机就会弹窗显示信息的大致内容。有了这个功能你就不会错过重要信息了。</p>
<p>
电脑上也有类似的功能,也很实用。但这个功能都是系统级别,我们能不能通过脚本方式去调用这个弹窗功能呢?</p>
<p>
答案是肯定的!</p>
<p>
例如,当脚本或 cron 任务完成时,长时间运行的编译任务失败,或者脚本执行过程中出现紧急问题,这些情况下如果能在电脑上弹出一条提醒,肯定会让隔壁的美女同事刮目相看!</p>
<p>
<img title="Linux使用终端工具给你的电脑发送弹窗提醒!" alt="Linux使用终端工具给你的电脑发送弹窗提醒!" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/c1534ddffc66fe566394bc5d349bff4d.jpg" width="auto"></p>
<p>
以下代码已在 Linux 系统上编写并测试通过,也可以移植到 Mac 电脑上。</p>
<h3>
从 Linux 终端发送弹窗通知</h3>
<p>
要从 Linux 终端发送通知,需要使用 notify-send 命令。这个命令大部分发行版都没有默认安装,需要我们自行动手。</p>
<p>
在 Fedora 上,输入:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ sudo dnf install notify-send </span></span>
</li>
</ol>
<p>
在基于 Debian 的发行版上,键入:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ sudo apt install notify-send </span></span>
</li>
</ol>
<p>
几个简单弹窗通知的例子:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ notify-send </span><span class="string">"liangxu is great!!"</span><span> </span></span>
</li>
<li>
<span>$ notify-send <span class="string">"welcome to liangxu's website"</span><span> </span><span class="string">"www.lxlinux.net"</span><span> </span></span>
</li>
</ol>
<p>
这个命令不仅支持弹窗,还可以修改紧急程度、自定义图标等。更多信息可以通过 man notify-send 来查询。</p>
<p>
你还可以在通知正文中使用一小段 HTML 标记来为你的信息增加一些格式,比如:加粗、斜体,等等。最重要的是,URL 还支持点击,非常方便。例如:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ notify-send -u critical \ </span></span>
</li>
<li>
<span> <span class="string">"Build failed!"</span><span> \ </span></span>
</li>
<li class="alt">
<span> <span class="string">"There were <b>123</b> errors. Click here to see the results: http://buildserver/latest"</span><span> </span></span>
</li>
</ol>
<p>
<img title="Linux使用终端工具给你的电脑发送弹窗提醒!" alt="Linux使用终端工具给你的电脑发送弹窗提醒!" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/72fb13c77f818302edb75fc984e1d63b.jpg" width="auto"></p>
<p>
发送的通知跟系统的其它通知样式一样,外观、行为并无二致。</p>
<h3>
结合 at 命令使用 notify-send</h3>
<p>
cron 命令通常用于定期调度任务,at 命令则是在指定时间单次执行指定命令。如果你像下面这样运行 at 命令,它会以交互模式启动,然后你可以在其中输入你要执行的命令:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ </span><span class="keyword">at</span><span> 12:00 </span></span>
</li>
</ol>
<p>
但我们一般不这么使用它。</p>
<p>
at 命令可以接受来自标准输入的参数,例如:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ echo </span><span class="string">"npm run build"</span><span> | </span><span class="keyword">at</span><span> now + 1 </span><span class="keyword">minute</span><span> </span></span>
</li>
<li>
<span>$ echo <span class="string">"backup-db"</span><span> | </span><span class="keyword">at</span><span> 13:00 </span></span>
</li>
</ol>
<p>
熟练使用 Linux 的小伙伴都知道,我们有多种指定时间的方法。</p>
<ul>
<li>
绝对时间,例如 10:00</li>
<li>
相对时间,例如 now + 2 hours</li>
<li>
特殊时间,例如 noon 或 midnight</li>
</ul>
<p>
利用 at 命令的这些特性,我们可以将它与 notify-send 命令结合使用,达到在未来的某个时间弹窗提醒的效果。例如:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ echo </span><span class="string">"notify-send 'Stop it and go home now?' 'Enough work for today.' -u critical"</span><span> | </span><span class="keyword">at</span><span> now </span></span>
</li>
</ol>
<p>
<img title="Linux使用终端工具给你的电脑发送弹窗提醒!" alt="Linux使用终端工具给你的电脑发送弹窗提醒!" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/b566230853771e4c48a5d216c7e5b777.jpg" width="auto"></p>
<h3>
编写脚本实现弹窗通知功能</h3>
<p>
现在我们知道 nofity-send 怎么玩了,但每次都要敲这么长的一串命令还是很不方便。</p>
<p>
作为程序员,我们能偷懒就偷懒,自己动手写脚本把这个功能封装起来!</p>
<p>
比如我们把它封装成一个 Bash 命令 remind ,然后通过下面方式来调用它:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ remind </span><span class="string">"I'm still here"</span><span> now </span></span>
</li>
<li>
<span>$ remind <span class="string">"Time to wake up!"</span><span> </span><span class="op">in</span><span> 5 minutes </span></span>
</li>
<li class="alt">
<span>$ remind <span class="string">"Dinner"</span><span> </span><span class="op">in</span><span> 1 </span><span class="keyword">hour</span><span> </span></span>
</li>
<li>
<span>$ remind <span class="string">"Take a break"</span><span> </span><span class="keyword">at</span><span> noon </span></span>
</li>
<li class="alt">
<span>$ remind <span class="string">"It's Friday pints time!"</span><span> </span><span class="keyword">at</span><span> 17:00 </span></span>
</li>
</ol>
<p>
简直太特么方便了!</p>
<p>
实现起来也很简单,我们可以将脚本保存在某个位置,例如,在 ~/bin/ 目录中,并在 .bashrc 配置文件中让它生效,以便在登录时加载它:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$ source ~/bin/remind </span></span>
</li>
</ol>
<p>
脚本内容如下:</p>
<ol class="dp-sql">
<li class="alt">
<span><span>#!/usr/bin/env bash </span></span>
</li>
<li>
<span><span class="keyword">function</span><span> remind () { </span></span>
</li>
<li class="alt">
<span> <span class="keyword">local</span><span> </span><span class="func">COUNT</span><span>=</span><span class="string">"$#"</span><span> </span></span>
</li>
<li>
<span> <span class="keyword">local</span><span> COMMAND=</span><span class="string">"$1"</span><span> </span></span>
</li>
<li class="alt">
<span> <span class="keyword">local</span><span> MESSAGE=</span><span class="string">"$1"</span><span> </span></span>
</li>
<li>
<span> <span class="keyword">local</span><span> OP=</span><span class="string">"$2"</span><span> </span></span>
</li>
<li class="alt">
<span> shift 2 </span>
</li>
<li>
<span> <span class="keyword">local</span><span> </span><span class="keyword">WHEN</span><span>=</span><span class="string">"$@"</span><span> </span></span>
</li>
<li class="alt">
<span> # Display help if <span class="keyword">no</span><span> parameters </span><span class="op">or</span><span> help command </span></span>
</li>
<li>
<span> if [[ $<span class="func">COUNT</span><span> -eq 0 || </span><span class="string">"$COMMAND"</span><span> == </span><span class="string">"help"</span><span> || </span><span class="string">"$COMMAND"</span><span> == </span><span class="string">"--help"</span><span> || </span><span class="string">"$COMMAND"</span><span> == </span><span class="string">"-h"</span><span> ]]; </span><span class="keyword">then</span><span> </span></span>
</li>
<li class="alt">
<span> echo <span class="string">"COMMAND"</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">" remind <message> <time>"</span><span> </span></span>
</li>
<li class="alt">
<span> echo <span class="string">" remind <command>"</span><span> </span></span>
</li>
<li>
<span> echo </span>
</li>
<li class="alt">
<span> echo <span class="string">"DESCRIPTION"</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">" Displays notification at specified time"</span><span> </span></span>
</li>
<li class="alt">
<span> echo </span>
</li>
<li>
<span> echo <span class="string">"EXAMPLES"</span><span> </span></span>
</li>
<li class="alt">
<span> echo <span class="string">' remind "Hi there" now'</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">' remind "Time to wake up" in 5 minutes'</span><span> </span></span>
</li>
<li class="alt">
<span> echo <span class="string">' remind "Dinner" in 1 hour'</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">' remind "Take a break" at noon'</span><span> </span></span>
</li>
<li class="alt">
<span> echo <span class="string">' remind "Are you ready?" at 13:00'</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">' remind list'</span><span> </span></span>
</li>
<li class="alt">
<span> echo <span class="string">' remind clear'</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">' remind help'</span><span> </span></span>
</li>
<li class="alt">
<span> echo </span>
</li>
<li>
<span> <span class="keyword">return</span><span> </span></span>
</li>
<li class="alt">
<span> fi </span>
</li>
<li>
<span> # <span class="keyword">Check</span><span> presence </span><span class="keyword">of</span><span> </span><span class="keyword">AT</span><span> command </span></span>
</li>
<li class="alt">
<span> if ! which <span class="keyword">at</span><span> >/dev/</span><span class="op">null</span><span>; </span><span class="keyword">then</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">"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'."</span><span> </span></span>
</li>
<li class="alt">
<span> <span class="keyword">return</span><span> </span></span>
</li>
<li>
<span> fi </span>
</li>
<li class="alt">
<span> # Run commands: list, clear </span>
</li>
<li>
<span> if [[ $<span class="func">COUNT</span><span> -eq 1 ]]; </span><span class="keyword">then</span><span> </span></span>
</li>
<li class="alt">
<span> if [[ <span class="string">"$COMMAND"</span><span> == </span><span class="string">"list"</span><span> ]]; </span><span class="keyword">then</span><span> </span></span>
</li>
<li>
<span> <span class="keyword">at</span><span> -l </span></span>
</li>
<li class="alt">
<span> elif [[ <span class="string">"$COMMAND"</span><span> == </span><span class="string">"clear"</span><span> ]]; </span><span class="keyword">then</span><span> </span></span>
</li>
<li>
<span> <span class="keyword">at</span><span> -r $(atq | cut -f1) </span></span>
</li>
<li class="alt">
<span> <span class="keyword">else</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">"remind: unknown command $COMMAND. Type 'remind' without any parameters to see syntax."</span><span> </span></span>
</li>
<li class="alt">
<span> fi </span>
</li>
<li>
<span> <span class="keyword">return</span><span> </span></span>
</li>
<li class="alt">
<span> fi </span>
</li>
<li>
<span> # Determine <span class="keyword">time</span><span> </span><span class="keyword">of</span><span> notification </span></span>
</li>
<li class="alt">
<span> if [[ <span class="string">"$OP"</span><span> == </span><span class="string">"in"</span><span> ]]; </span><span class="keyword">then</span><span> </span></span>
</li>
<li>
<span> <span class="keyword">local</span><span> </span><span class="keyword">TIME</span><span>=</span><span class="string">"now + $WHEN"</span><span> </span></span>
</li>
<li class="alt">
<span> elif [[ <span class="string">"$OP"</span><span> == </span><span class="string">"at"</span><span> ]]; </span><span class="keyword">then</span><span> </span></span>
</li>
<li>
<span> <span class="keyword">local</span><span> </span><span class="keyword">TIME</span><span>=</span><span class="string">"$WHEN"</span><span> </span></span>
</li>
<li class="alt">
<span> elif [[ <span class="string">"$OP"</span><span> == </span><span class="string">"now"</span><span> ]]; </span><span class="keyword">then</span><span> </span></span>
</li>
<li>
<span> <span class="keyword">local</span><span> </span><span class="keyword">TIME</span><span>=</span><span class="string">"now"</span><span> </span></span>
</li>
<li class="alt">
<span> <span class="keyword">else</span><span> </span></span>
</li>
<li>
<span> echo <span class="string">"remind: invalid time operator $OP"</span><span> </span></span>
</li>
<li class="alt">
<span> <span class="keyword">return</span><span> </span></span>
</li>
<li>
<span> fi </span>
</li>
<li class="alt">
<span> # Schedule the notification </span>
</li>
<li>
<span> echo <span class="string">"notify-send '$MESSAGE' 'Reminder' -u critical"</span><span> | </span><span class="keyword">at</span><span> $</span><span class="keyword">TIME</span><span> 2>/dev/</span><span class="op">null</span><span> </span></span>
</li>
<li class="alt">
<span> echo <span class="string">"Notification scheduled at $TIME"</span><span> </span></span>
</li>
<li>
<span>} </span>
</li>
</ol>
<p>
好好玩玩吧!</p>
<p>
原文链接:https://mp.weixin.qq.com/s/ln-YHil-eDkuXh-Sf4VtKQ</p>
頁:
[1]