使用终端工具给你的电脑发送弹窗提醒

news2024/12/1 0:42:38

大家好,我是良许。

现在人手一部智能手机,这些智能手机都有个非常实用的功能,那就是弹窗提醒。当我们收到短信,或者微信信息时,手机就会弹窗显示信息的大致内容。有了这个功能你就不会错过重要信息了。

电脑上也有类似的功能,也很实用。但这个功能都是系统级别,我们能不能通过脚本方式去调用这个弹窗功能呢?

答案是肯定的!

例如,当脚本或 cron 任务完成时,长时间运行的编译任务失败,或者脚本执行过程中出现紧急问题,这些情况下如果能在电脑上弹出一条提醒,肯定会让隔壁的美女同事刮目相看!

file

以下代码已在 Linux 系统上编写并测试通过,也可以移植到 Mac 电脑上。

从 Linux 终端发送弹窗通知

要从 Linux 终端发送通知,需要使用 notify-send 命令。这个命令大部分发行版都没有默认安装,需要我们自行动手。

在 Fedora 上,输入:

$ sudo dnf install notify-send

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

$ sudo apt install notify-send

几个简单弹窗通知的例子:

$ notify-send "liangxu is great!!"
$ notify-send "welcome to liangxu's website" "www.lxlinux.net"

这个命令不仅支持弹窗,还可以修改紧急程度、自定义图标等。更多信息可以通过 man notify-send 来查询。

你还可以在通知正文中使用一小段 HTML 标记来为你的信息增加一些格式,比如:加粗、斜体,等等。最重要的是,URL 还支持点击,非常方便。例如:

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

file

发送的通知跟系统的其它通知样式一样,外观、行为并无二致。

结合 at 命令使用 notify-send

cron 命令通常用于定期调度任务,at 命令则是在指定时间单次执行指定命令。如果你像下面这样运行 at 命令,它会以交互模式启动,然后你可以在其中输入你要执行的命令:

$ at 12:00

但我们一般不这么使用它。

at 命令可以接受来自标准输入的参数,例如:

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

熟练使用 Linux 的小伙伴都知道,我们有多种指定时间的方法。

  • 绝对时间,例如 10:00

  • 相对时间,例如 now + 2 hours

  • 特殊时间,例如 noonmidnight

利用 at 命令的这些特性,我们可以将它与 notify-send 命令结合使用,达到在未来的某个时间弹窗提醒的效果。例如:

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

file

编写脚本实现弹窗通知功能

现在我们知道 nofity-send 怎么玩了,但每次都要敲这么长的一串命令还是很不方便。

作为程序员,我们能偷懒就偷懒,自己动手写脚本把这个功能封装起来!

比如我们把它封装成一个 Bash 命令 remind ,然后通过下面方式来调用它:

$ 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

简直太特么方便了!

实现起来也很简单,我们可以将脚本保存在某个位置,例如,在 ~/bin/ 目录中,并在 .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"
}

好好玩玩吧!


学习编程,千万不要急于求成,一定要多读一些经典书籍,多看源码,多下苦功夫去死磕代码,这样技术才能长进。给大家分享一些程序员必读经典书籍,一定要多读几遍:

file

推荐阅读:

  • 干货 | 程序员进阶架构师必备资源免费送
  • 刷题 | LeetCode算法刷题神器,看完 BAT 随你挑!

欢迎关注我的博客:良许Linux教程网,满满都是干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 流量统计

Android 流量统计最近项目上有一个应用流量统计的功能需要实现&#xff0c;在此总结一下 流量统计架构 在Android9.0之前&#xff0c;流量监控是基于xt_qtaguid模块的&#xff0c;通过读取/proc/net/xt_qtaguid/stats文件内容进行解析获取对应流量数据。 Android9.0之后&…

51单片机学习笔记_12 LCD1602 原理及其模块化代码

LCD1602 liquid crystal display 液晶显示屏&#xff0c;一种字符型液晶显示模块&#xff0c;可以显示 16*2 个字符&#xff0c;每个字符是 5*7 点阵。 P0 P2 会和数码管、LED 一定程度上冲突。 地。 Vcc。 调对比度的。 RS&#xff1a;数据指令端。1代表 DB 是数据&#x…

想要去字节跳动面试Android岗,给你这些面试知识点

关于面试字节跳动&#xff0c;我总结一些面试点&#xff0c;希望可以帮到更多的小伙伴&#xff0c;由于篇幅问题这里没有把全部的面试知识点问题都放上来&#xff01;&#xff01;目录&#xff1a;1.网络2.Java 基础&容器&同步&设计模式3.Java 虚拟机&内存结构…

实操go开发环境的配置

1、Go 安装包下载&#xff0c;下载地址如下&#xff1a; go语言中文网下载&#xff08;本人电脑的系统是Windows&#xff0c;这里以Windows版本的安装包为例&#xff0c;安装就是傻瓜式安装&#xff0c;只要点下一步–下一步–完成就可以了&#xff0c;本人安装在C盘下。 我…

AQS学习:ReentrantLock源码解析

前言 多线程知识中理解了ReentrantLock之后&#xff0c;对于整个AQS也会有大概的理解&#xff0c;后面再去看其它锁的源码就会比较容易。下面带大家一块来学习ReentrantLock源码。 概述 ReentrantLock是可重入的互斥锁&#xff0c;虽然具有与synchronized相同功能&#xff0…

App.vue中读取不到路由的信息

问题&#xff1a; ​ 首先定义了一个路由&#xff0c;并且在路由元里面存储了一个变量&#xff0c;在App.vue里面访问这个变量的时候却显示undefined&#xff01;在路由对应的组件中却能访问到&#xff01; 定义的路由元信息&#xff1a; 为啥访问不到…,懵逼的我在App.vue里…

宝塔面板公网ip非80端口非443端口部署ssl

有不少人使用家用宽带&#xff0c;虽然申请下来了公网ip&#xff0c;但是运营商封了80与443端口&#xff0c;但仍想使用ssl证书 一、仅封80端口 1、先在宝塔面板里创建网站&#xff0c;域名为test.xxx.cn:8085 2、再到域名运营商做A记录解析&#xff0c;此时可以通过http://…

不同语言下的定时器,你都掌握了吗?

我们大家都对定时器不陌生&#xff0c;无论是现实中还是项目中&#xff0c;都离不开定时。在现实中&#xff0c;它叫闹钟&#xff0c;在项目上&#xff0c;它叫定时器&#xff0c;即定时触发某件事情。它能帮助我们在某一个既定的时间节点上&#xff0c;来提醒我们做一些事情&a…

Markdown基本语法简介

前言&#xff1a;当你在git平台创建一个仓库时&#xff0c;平台会自动创建一个README.md文件&#xff0c;并将它的内容展现在web端页面&#xff0c;方面其他读者查阅。README.md实则是一个适用Markdown语法的文本文件&#xff0c;从他的后缀md即可看出它是Markdown的缩写。在gi…

实战:kubeadm方式搭建k8s集群(k8s-v1.22.2,containerd-v1.5.5)-2023.2.22(测试成功)

实验环境 1、硬件环境 3台虚机 2c2g,20g。(nat模式&#xff0c;可访问外网) 角色主机名ipmaster节点master1172.29.9.51node节点node1172.29.9.52node节点node2172.29.9.53 2、软件环境 软件版本操作系统centos7.6_x64 1810 mini(其他centos7.x版本也行)containerdv1.5.5ku…

【项目】DTO、VO以及PO之间的关系和区别

【项目】DTO、VO以及PO之间的关系和区别 文章目录【项目】DTO、VO以及PO之间的关系和区别1.概念2. 作用1.概念 DTO&#xff1a;DTO是 Data Transfer Object 的缩写&#xff0c;也叫数据传输对象。 PO&#xff1a;PO是 Persistent Object 的缩写&#xff0c;也叫持久化对象。 …

Java 集合 --- HashMap的底层原理

Java 集合 --- HashMap的底层原理HashMap的下标计算计算步骤为什么要 h ^ (h >>> 16)为什么数组长度必须是2^nHashMap的树化HashMap的扩容HashMap的put流程HashMap的线程安全问题HashMap的下标计算 计算步骤 第一步: 计算hash值 将h 和 h右移十六位的结果 进行XOR操…

Java的dump文件分析及JProfiler使用

Java的dump文件分析及JProfiler使用 1 dump文件介绍 从软件开发的角度上&#xff0c;dump文件就是当程序产生异常时&#xff0c;用来记录当时的程序状态信息&#xff08;例如堆栈的状态&#xff09;,用于程序开发定位问题。 idea配置发生OOM的时候指定路径生成dump文件 # 指定…

关于upstream的八种回调方法

1 creat_request调用背景&#xff1a;用于创建自己模板与第三方服务器的第一次连接步骤1&#xff09; 在Nginx主循环&#xff08;ngx_worker_process_cycle方法&#xff09; 中&#xff0c;会定期地调用事件模块&#xff0c; 以检查是否有网络事件发生。2&#xff09; 事件模块…

智慧校园平台源码 智慧教务 智慧电子班牌系统

系统介绍 智慧校园系统是通过信息化手段,实现对校园内各类资源的有效集成 整合和优化&#xff0c;实现资源的有效配置和充分利用&#xff0c;将校务管理过程的优化协调。为校园提供数字化教学、数字化学习、数字化科研和数字化管理。 致力于为家长和教师提供一个全方位、多层…

ChatGPT的出现网络安全专家是否会被替代?

ChatGPT的横空出世&#xff0c;在业界掀起了惊涛骇浪。很多人开始担心&#xff0c;自己的工作岗位是否会在不久的将来被ChatGPT等人工智能技术所取代。网络安全与先进技术发展密切相关&#xff0c;基于人工智能的安全工具已经得到很多的应用机会&#xff0c;那么未来是否更加可…

关于表格表头和第一列固定

主要是使用黏性布局 position: sticky; top: 0;//left:0; 来实现 给test-table一个固定的宽和高 然后trauma-table开启inline-flex布局&#xff08;注意不能用flex布局 否则 trauma-table的宽度不能被子元素撑起来 会滚动到一定宽度后吸左侧的效果就没有了&#xff09;&am…

Spring 用到了哪些设计模式

关于设计模式&#xff0c;如果使用得当&#xff0c;将会使我们的代码更加简洁&#xff0c;并且更具扩展性。本文主要讲解Spring中如何使用策略模式&#xff0c;工厂方法模式以及Builder模式。1. 策略模式关于策略模式的使用方式&#xff0c;在Spring中其实比较简单&#xff0c;…

【每日一题】缓存穿透、缓存击穿、缓存雪崩及解决方案

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 当下ChatGPT很火&#xff0c;让人心痒痒想试一试好不好用&#xff0c;因此我就试着借它写一篇文章&#xff0c;但是试了几次最终还是没有…

电子技术——负反馈特性

电子技术——负反馈特性 本节我们进一步深入介绍负反馈特性。 增益脱敏性 假设 β\betaβ 是一个常数。考虑下面的微分方程&#xff1a; dAfdA(1Aβ)2dA_f \frac{dA}{(1 A\beta)^2} dAf​(1Aβ)2dA​ 将上式除以 AfA1AβA_f \frac{A}{1A\beta}Af​1AβA​ 得到&#xff1…