Obsidian

用 obsidian-cli 从命令行触发同步

笔记同步助手 · ·Obsidian 教程
ObsidianCLI命令行自动化cron教程

通常我们在 Obsidian 里同步笔记是点左侧栏那个「同」字图标。但如果你想把这个动作自动化——开机自动拉、每天定时拉、写完一段长 shell 流水线最后把笔记也拉一下——手动点显然不合适。

好消息是:Obsidian 1.11 起官方自带 obsidian-cli 命令行工具,本文档教你用一行命令触发「笔记同步助手」的”同步新变化”,效果跟手动点「同」图标完全一致。

一、确认前置条件

  • Obsidian 版本 ≥ 1.11(命令行接口在这版引入;点 Obsidian 左下齿轮 → 关于,能看到版本号)
  • 桌面端:仅支持 Windows / macOS / Linux 桌面端 Obsidian;移动端没有这个能力
  • 笔记同步助手插件已安装并启用:参考 Obsidian 安装与配置教程

二、在 Obsidian 里启用命令行接口

这个开关默认是关的,要去 Obsidian 设置里手动打开:

Obsidian 设置 → 通用(General)→ 高级(Advanced)→ 命令行接口(Command line interface)

把开关打开就行。

同一个高级区域里还有一个”安装命令行快捷方式(Install command line shortcut)“按钮——强烈建议一并点一下。它会把 obsidian-cli 拷贝/链接到 PATH 里(macOS / Linux 是 /usr/local/bin/obsidian~/.local/bin/obsidian;Windows 是把 Obsidian 目录加到用户 PATH)。

装完之后,你在任何终端直接打 obsidian 就等同于打 obsidian-cli,省得每次写完整路径。

三、一行命令触发同步

启用后,打开任意终端,执行:

obsidian command id=notehelper:sync

成功的话,终端会回显:

Executed: notehelper:sync

同时你的 Obsidian 窗口会像点了「同」图标一样,弹出”开始同步”和”同步完成”的提示,把云端的新笔记拉到本地。

obsidian-cli 触发笔记同步助手的「同步新变化」命令后,Obsidian 自动拉取新文章,右上角出现"同步完成!X 篇文章"提示,文章正文及前置元数据按 properties 渲染

上图是真实运行截图:

  • 命令行执行 obsidian command id=notehelper:sync 后,Obsidian 自动从云端拉了 1 篇文章下来
  • 右上角的”同步完成!1 篇文章”提示是同步成功的回执
  • 文章的标题、作者、来源、URL、保存时间、标签都按 properties 渲染好了,跟你在微信里转发后拿到的笔记一模一样

四、放进自动化场景

下面是几个常见的接入方式,按你自己的口味选。

4.1 macOS / Linux:cron 每小时拉一次

crontab -e 加一行:

0 * * * * /usr/local/bin/obsidian command id=notehelper:sync >> ~/obsidian-sync.log 2>&1

需要 Obsidian 当前是开着的,命令行才能跟它通信。如果你希望”Obsidian 不开也能跑”——这个本机命令行做不到,请用企业微信客服 AI 助理那种云端方案。

4.2 macOS:launchd 开机自动拉一次

~/Library/LaunchAgents/com.obsidian.sync-on-login.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.obsidian.sync-on-login</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/obsidian</string>
        <string>command</string>
        <string>id=notehelper:sync</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

launchctl load ~/Library/LaunchAgents/com.obsidian.sync-on-login.plist 启用。

4.3 Windows:任务计划程序每小时拉

任务计划程序(Task Scheduler)→ 创建任务:

  • 触发器:每天,每隔 1 小时
  • 操作:启动程序,路径填 Obsidian 安装目录下的 obsidian-cli.exe,参数 command id=notehelper:sync

4.4 别的 shell 流水线后置一步同步

比如你写了个清理 vault 的脚本,跑完想立刻把云端的新文章拉下来:

#!/bin/bash
# 你的脚本逻辑...
echo "处理完了,拉一下新笔记"
obsidian command id=notehelper:sync

五、其他能用的命令

obsidian command id=... 适用于任何插件 / 内置功能注册的命令——不光是同步。比如:

命令作用
obsidian command id=notehelper:sync触发笔记同步助手「同步新变化」
obsidian commands列出当前 vault 里所有可用的命令 ID
obsidian open path=Synced/某篇笔记.md在当前 vault 里打开一篇笔记
obsidian help查看完整的 cli 帮助

想看 Note Sync Helper 插件目前注册了哪些命令,跑 obsidian commands | grep notehelper 即可。

六、常见问题

Q1. 命令返回 “Command line interface is not enabled”

第二步的开关没打开。回到 Obsidian 设置 → 通用 → 高级,把”命令行接口”打开。

Q2. 命令返回 “Unable to find Obsidian”

obsidian-cli 走本地 socket 跟运行中的 Obsidian 通信。Obsidian 必须当前正开着——CLI 不能”启动 Obsidian 并执行命令”,只能”发命令给已经开着的 Obsidian”。

Q3. 多 vault 怎么指定?

vault=<名字> 作为第一个参数:

obsidian vault=工作笔记 command id=notehelper:sync

不指定时默认目标是当前焦点窗口对应的 vault。

Q4. 想知道命令底层在做什么?

obsidian command id=notehelper:sync 等同于:

obsidian-cli → 本机 Unix socket / Windows 命名管道
    → Obsidian 主进程
    → 渲染器 window.handleCli
    → app.commands.executeCommandById("notehelper:sync")
    → 笔记同步助手 fetchOmnivore()
    → 把云端新文章写到 vault/Synced/

跟你用鼠标点「同」字图标走的代码路径完全一致,只是入口换成了命令行。

相关阅读