使用終端工具給你的電腦傳送彈窗提醒!

良許發表於2023-02-26

大家好,我是良許。

現在人手一部智慧手機,這些智慧手機都有個非常實用的功能,那就是彈窗提醒。當我們收到簡訊,或者微信資訊時,手機就會彈窗顯示資訊的大致內容。有了這個功能你就不會錯過重要資訊了。

電腦上也有類似的功能,也很實用。但這個功能都是系統級別,我們能不能透過指令碼方式去呼叫這個彈窗功能呢?

答案是肯定的!

例如,當指令碼或 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

免費送給大家,只求大家金指給我點個贊!

程式設計師必讀經典書單(高畫質PDF版)

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章

推薦閱讀:

歡迎關注我的部落格:良許Linux教程網,滿滿都是乾貨!

相關文章