Skip to content

Obsidian Shell Commands

Obsidian Shell Commands(OSC)是一个强大的插件,允许你在 Obsidian 内部直接执行系统命令和脚本,实现自动化工作流。

什么是 Shell 命令

Shell 命令是在操作系统终端中执行的命令。通过 OSC 插件,你可以:

  • 在 Obsidian 中运行系统命令
  • 自动化重复性任务
  • 与外部工具集成
  • 处理文件和笔记
  • 调用 Python、Node.js 等脚本

安装与配置

安装插件

  1. 打开 Obsidian 设置
  2. 进入「第三方插件」
  3. 关闭安全模式(如果需要)
  4. 浏览插件市场
  5. 搜索「Obsidian Shell Commands」
  6. 安装并启用

基本配置

首次使用需要设置:

  1. 允许插件运行命令:确认安全提示
  2. 配置命令输出位置:选择输出显示方式
  3. 设置快捷键(可选)
  4. 配置环境变量(可选)

安全设置

OSC 提供多层安全机制:

设置说明
命令白名单只允许特定命令执行
确认提示执行前显示确认对话框
输出限制限制输出长度
超时设置设置命令执行超时

创建命令

基本步骤

  1. 打开插件设置
  2. 点击「添加新命令」
  3. 设置命令名称和 ID
  4. 输入要执行的命令
  5. 设置输出选项
  6. 配置触发方式
  7. 保存命令

命令配置选项

yaml
命令配置:
  名称: 命令显示名称
  ID: unique-command-id
  命令: echo "Hello"
  输出:
    显示位置: 面板/通知/剪贴板/文件
    显示时机: 始终/仅错误时/仅成功时
  触发:
    快捷键: Ctrl+Shift+E
    命令面板: 
    移动端: 

输出选项

输出到面板

在 Obsidian 面板中显示输出:

bash
# 在输出面板显示
echo "Hello Obsidian"

输出到通知

以通知形式显示结果:

bash
# 短通知
date +"%Y-%m-%d"

输出到剪贴板

将结果复制到剪贴板:

bash
# 复制日期到剪贴板
date +"%Y-%m-%d"

追加到笔记

将输出追加到当前笔记:

bash
# 在笔记末尾追加时间戳
echo "\n\n最后更新:$(date)"

内置变量

OSC 提供丰富的内置变量,在命令中使用 语法。

文件相关变量

变量说明示例值
库根目录路径/Users/user/notes
当前文件名笔记.md
当前文件完整路径/Users/user/notes/笔记.md
当前文件所在目录/Users/user/notes
文件扩展名md
文件内容笔记全文

选择相关变量

变量说明
选中的文本
选择起始位置
选择结束位置

时间相关变量

变量说明示例值
当前日期2024-01-15
当前时间14:30:00
Unix 时间戳1705315800
日期时间2024-01-15 14:30:00

剪贴板变量

变量说明
剪贴板内容
HTML 格式剪贴板

自定义变量

在设置中定义自定义变量:

yaml
自定义变量:
  PROJECT_PATH: /path/to/project
  AUTHOR: 张三
  BLOG_URL: https://example.com

使用示例:

bash
echo "作者:{{AUTHOR}}"
echo "项目路径:$PROJECT_PATH"

实用命令示例

文件操作

列出笔记文件

bash
# 列出库中所有 Markdown 文件
find "{{vault_path}}" -name "*.md" -type f

统计笔记数量

bash
# 统计 Markdown 文件数量
find "{{vault_path}}" -name "*.md" -type f | wc -l

搜索内容

bash
# 搜索包含特定关键词的文件
grep -l "关键词" "{{vault_path}}"/*.md

创建文件夹

bash
# 创建日期命名的文件夹
mkdir -p "{{vault_path}}/日记/{{date:YYYY}}/{{date:MM}}"

文本处理

插入日期时间

bash
# 插入格式化日期
date +"%Y年%m月%d日 %H:%M"

生成 UUID

bash
# macOS/Linux
uuidgen

# 或使用 Python
python3 -c "import uuid; print(str(uuid.uuid4()))"

JSON 格式化

bash
# 格式化剪贴板中的 JSON
echo "{{clipboard}}" | python3 -m json.tool

Markdown 转换

bash
# 使用 pandoc 转换
pandoc "{{file_path}}" -o "{{file_name}}.html"

外部工具集成

运行 Python 脚本

bash
# 执行 Python 脚本
python3 "{{vault_path}}/scripts/process.py" "{{file_path}}"

调用 API

bash
# 获取天气信息
curl -s "wttr.in/?format=3"

# 获取汇率
curl -s "https://api.exchangerate-api.com/v4/latest/USD"

Git 操作

bash
# Git 状态
cd "{{vault_path}}" && git status

# Git 提交
cd "{{vault_path}}" && git add . && git commit -m "Auto backup {{date}}"

# Git 推送
cd "{{vault_path}}" && git push origin main

图片处理

bash
# 压缩图片 (需要安装 imagemagick)
convert "{{vault_path}}/attachments/image.png" -quality 85% "{{vault_path}}/attachments/image_compressed.png"

# 调整图片大小
convert "{{vault_path}}/attachments/image.png" -resize 800x600 "{{vault_path}}/attachments/image_resized.png"

自动化工作流

创建每日日记

bash
# 创建每日日记文件
FILE="{{vault_path}}/日记/{{date:YYYY}}/{{date:MM}}/{{date}}.md"
if [ ! -f "$FILE" ]; then
  mkdir -p "$(dirname "$FILE")"
  cat > "$FILE" << EOF
---
created: {{date}}
tags: [日记]
---

# {{date:YYYY年MM月DD日}} 日记

## 今日计划

- [ ] 

## 工作记录

## 今日总结
EOF
fi
echo "日记已创建:$FILE"

备份笔记

bash
# 创建备份
BACKUP_DIR="{{vault_path}}/../backups"
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup_{{date}}.tar.gz" -C "{{vault_path}}" .
echo "备份完成:backup_{{date}}.tar.gz"

清理空文件

bash
# 查找并删除空文件
find "{{vault_path}}" -name "*.md" -type f -empty

进阶工作流

与 Templater 结合

在 Templater 模板中调用 Shell 命令:

markdown
---
created: {{date}}
word_count: <% tp.user.shell("wc -w {{file_path}}") %>
---

# 笔记标题

字数统计:`<% tp.user.shell("wc -w {{file_path}}") %>`

条件执行

根据条件执行不同命令:

bash
# 根据文件类型执行不同操作
if [[ "{{file_extension}}" == "md" ]]; then
  echo "Markdown 文件"
elif [[ "{{file_extension}}" == "canvas" ]]; then
  echo "白板文件"
fi

链式命令

组合多个命令:

bash
# 备份、提交、推送一体化
cd "{{vault_path}}" && \
  tar -czf "../backup_{{date}}.tar.gz" . && \
  git add . && \
  git commit -m "Auto backup {{date}}" && \
  git push origin main && \
  echo "备份和同步完成!"

交互式命令

使用 zenityosascript 创建对话框:

bash
# macOS 显示对话框
osascript -e 'display dialog "确认执行?" buttons {"取消", "确认"} default button "确认"'

# Linux 显示对话框
zenity --question --text="确认执行?"

跨平台兼容

平台检测

bash
# 检测操作系统
if [[ "$OSTYPE" == "darwin"* ]]; then
  echo "macOS"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
  echo "Linux"
elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]]; then
  echo "Windows"
fi

跨平台命令

复制到剪贴板

bash
# macOS
echo "内容" | pbcopy

# Linux (需要 xclip)
echo "内容" | xclip -selection clipboard

# Windows (Git Bash)
echo "内容" | clip

# 跨平台函数
copy_to_clipboard() {
  if command -v pbcopy &> /dev/null; then
    pbcopy
  elif command -v xclip &> /dev/null; then
    xclip -selection clipboard
  elif command -v clip.exe &> /dev/null; then
    clip.exe
  fi
}
echo "内容" | copy_to_clipboard

打开文件

bash
# macOS
open "{{file_path}}"

# Linux
xdg-open "{{file_path}}"

# Windows
start "{{file_path}}"

平台特定配置

yaml
# Windows PowerShell 配置
shell: powershell
命令: Get-Date -Format "yyyy-MM-dd"

# macOS/Linux Bash 配置
shell: bash
命令: date +"%Y-%m-%d"

触发方式

快捷键

为命令绑定快捷键:

  1. 打开「设置」→「快捷键」
  2. 搜索命令名称
  3. 点击添加快捷键
  4. 按下组合键

命令面板

通过命令面板执行:

Ctrl+Shift+P → 搜索命令名称 → Enter

斜杠命令

使用斜杠命令触发:

/shell:命令名称

移动端

在移动端使用:

  1. 向下滑动打开命令面板
  2. 搜索 Shell 命令
  3. 点击执行

自动触发

配置自动触发:

yaml
自动触发:
  事件: on-file-open
  条件: file.extension == "md"
  命令: echo "文件已打开"

安全最佳实践

风险提示

使用 Shell 命令需要注意:

风险说明防护措施
命令注入用户输入可能被执行验证和转义输入
数据丢失危险命令可能删除文件先备份,再执行
权限泄露命令可能访问敏感数据限制命令权限
系统损坏错误命令可能影响系统使用沙箱环境

安全建议

  1. 使用绝对路径:避免相对路径带来的问题
bash
# 推荐
/Users/user/notes/script.sh

# 不推荐
./script.sh
  1. 验证用户输入:处理变量时进行验证
bash
# 验证文件名
if [[ "{{file_name}" =~ ^[a-zA-Z0-9_-]+\.md$ ]]; then
  echo "有效的文件名"
else
  echo "无效的文件名"
  exit 1
fi
  1. 使用命令白名单:只允许特定命令执行
yaml
白名单设置:
  允许的命令:
    - echo
    - date
    - ls
    - grep
  1. 备份重要数据:执行危险命令前先备份
bash
# 备份后再删除
cp "{{file_path}}" "{{file_path}}.bak"
rm "{{file_path}}"
  1. 错误处理:添加错误处理逻辑
bash
set -e  # 命令失败时退出
set -u  # 变量未定义时报错
set -o pipefail  # 管道中任何命令失败时报错

故障排除

命令不执行

检查以下问题:

  1. 命令语法是否正确

    bash
    # 在终端中测试命令
    echo "test"
  2. 插件是否有执行权限

    设置 → Shell Commands → 允许执行命令
  3. 查看输出面板的错误信息

    命令面板 → 显示 Shell 输出面板

输出乱码

解决方法:

bash
# 设置编码
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# 或使用 iconv 转换
command | iconv -f GBK -t UTF-8

权限问题

解决方法:

bash
# 给脚本添加执行权限
chmod +x script.sh

# 使用 sudo(谨慎使用)
sudo command

变量替换失败

检查变量名是否正确:

bash
# 正确
echo "{{file_name}}"

# 错误(变量名拼写错误)
echo "{{filename}}"

推荐配置

macOS

bash
# ~/.zshrc 或 ~/.bash_profile
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# 常用别名
alias obsidian-cd="cd /Users/user/notes"
alias obsidian-backup="tar -czf ~/backup_$(date +%Y%m%d).tar.gz /Users/user/notes"

Windows

powershell
# PowerShell 配置
$OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 设置执行策略
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Linux

bash
# ~/.bashrc
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# 常用函数
obsidian() {
  cd /home/user/notes
  $@
}

快速参考

常用变量

变量用途
库路径
当前文件路径
文件名
选中文本
剪贴板内容
当前日期

常用命令模板

bash
# 日期时间
date +"%Y-%m-%d %H:%M:%S"

# Git 操作
cd "{{vault_path}}" && git status

# 文件统计
find "{{vault_path}}" -name "*.md" | wc -l

# API 调用
curl -s "https://api.example.com/data"

# Python 脚本
python3 "{{vault_path}}/scripts/script.py"

提示

结合快捷键和斜杠命令,可以将常用 Shell 命令变成一键执行,大幅提升效率!

注意

执行 Shell 命令时务必谨慎,错误的命令可能损坏文件或系统。建议先在测试环境中验证命令,再在生产环境中使用。

最后更新:2026年2月22日编辑此页反馈问题