Make Your Terminal Beep (Via Slack)

如果终端能在一个长任务运行结束时发出 Beep 声来提醒我,我就无需时刻关注他们。这一灵感来源于 Ben Stolovitz 的 Computers should beep more

现代终端通常不 beep,我也不开声音,不过我能看到 Slack 弹出通知。所以我想,能不能写个简单的 beep 函数,硬编码一个 Slack Webhook。在命令的末尾加上它,它就会在任务结束时 beep 我一下。

这个 beep 函数判断命令的返回值来给出不同的消息图标,并且接受一个注释以区分不同的 beep。要使用它,只需把函数放在 .bashrc 中并重启终端,然后在普通命令的末尾加上 ;beep 或者 ;beep yournote。比如 sleep 10; beep "beeeep"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
function beep() {
    local status=$?
    local note="${1:-终端任务已结束}"
    # 注意:不要将包含真实 URL 的文件上传到公开的代码仓库 (GitHub 等)
    local webhook_url="https://hooks.slack.com/services/YOUR/WEBHOOK/URL_HERE"
    
    local icon="✅"
    if [ $status -ne 0 ]; then
        icon="❌"
    fi

    # 发送请求
    curl -X POST -H 'Content-type: application/json' \
    --data "{\"text\":\"${icon} ${note}\"}" \
    "$webhook_url" &>/dev/null
}

你可以用任何有 Webhook 功能的应用代替 Slack。

如果你不想经历创建 Slack 工作区的繁琐流程,我推测 ntfy.sh 会是个极佳的替代品。根据它的介绍,你只需想一个 Topic 名字,在你的 ntfy.sh APP 上跟踪那个 Topic,然后就能推送:

1
curl -d "beeep" ntfy.sh/my-notifier-Agd2SqgE5IglY9

Topic 很像一个 Secret Token,知道你 Topic 的人就能看到里面的内容,所以最好生成一个上面这种不容易重复和猜到的。