用 obsidian-cli 从命令行触发同步
通常我们在 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 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/
跟你用鼠标点「同」字图标走的代码路径完全一致,只是入口换成了命令行。