日晶金鑫 發表於 2023-11-9 00:00:00

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 &lt;b&gt;123&lt;/b&gt; 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 &lt;message&gt; &lt;time&gt;"</span><span> </span></span>
</li>
        <li class="alt">
                <span>    echo <span class="string">"    remind &lt;command&gt;"</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> &gt;/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&gt;/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]
查看完整版本: Linux使用终端工具给你的电脑发送弹窗提醒!