curl&jq 有意思的小功能

前段时间成功把笔记本上多余的”小爱键”映射出来了(参考),正想着该用这个按键干些什么,然后无意见翻出了在收藏夹里面的hitokoto,就写了这一个好玩的功能

1
bind = , XF86Launch1, exec, wpaperctl next-wallpaper; notify-send --category=hitokoto -t 1 "$(curl -s https://v1.hitokoto.cn | jq -r '"\(.hitokoto)\n—— 《\(.from)》"')"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ curl -s https://v1.hitokoto.cn | jq
{
"id": 3720,
"uuid": "895a8515-9bb4-4b30-bd3a-75a6971f3d40",
"hitokoto": "我们一直在离别中,比如和爱的人,和伤害,甚至和时光。",
"type": "a",
"from": "萤火虫之墓",
"from_who": null,
"creator": "eaea",
"creator_uid": 304,
"reviewer": 0,
"commit_from": "web",
"created_at": "1532819547",
"length": 26
}

虽然实现简单,但也很好玩

jq的字符串插值

其中jq的字符串插值部分写了很久,这里简单分析一下

  1. 外层的单引号 ('...'):

    • 这是给 Shell 看的。
    • 在 Shell 中,单引号内的所有字符都会被视为字面量(Literal characters),Shell 不会对它们进行任何解释或替换。这意味着 $, \, ( 等特殊字符在单引号内都会失去它们的特殊含义。
    • 目的:确保 jq 程序接收到的参数完全"\(.hitokoto)\n—— 《\(.from)》" 这一整个字符串,防止 Shell 试图解释里面的 \() 等。
  2. 内层的双引号 ("..."):

    • 这是给 jq 程序看的。
    • jq 的语法中,双引号用来定义一个字符串字面量
    • 目的:告诉 jq 我们想要构造一个字符串。
  3. 字符串插值 (\(...)):

    • 这是 jq 的一个特性,叫做字符串插值(String Interpolation)。
    • 它允许你在一个 jq 的字符串字面量(由双引号包围)中嵌入 jq 表达式的结果。
    • \.hitokoto & \.from:这是一个 jq 表达式,用于从输入的 JSON 对象中提取 hitokotofrom 字段的值。
    • —— 《 》:这些是普通的文本字符,会原样出现在最终的字符串里。

The End

虽然你可能听过很多次了,但是我再一次感受到了Linux的伟大而美妙的设计哲学:Do One Thing and Do It Well!,就像一个瑞士军刀,对每一件事情都有一样趁手的工具,利用管道,使用文本流作为通用接口,让这些工具能够协同工作,我要实现这么一个复杂的功能(从一言的接口获取json,并且作为一个通知发送出来),不需要繁琐的编程/查找api,只需要把手头上这些小型的工具像搭积木一样搭起来就好了


curl&jq 有意思的小功能
https://20040702.xyz/2025/04/10/jq/
作者
Seeker
发布于
2025年4月10日
许可协议