Obsidian Shell Commands
Obsidian Shell Commands(OSC)是一个强大的插件,允许你在 Obsidian 内部直接执行系统命令和脚本,实现自动化工作流。
什么是 Shell 命令
Shell 命令是在操作系统终端中执行的命令。通过 OSC 插件,你可以:
- 在 Obsidian 中运行系统命令
- 自动化重复性任务
- 与外部工具集成
- 处理文件和笔记
- 调用 Python、Node.js 等脚本
安装与配置
安装插件
- 打开 Obsidian 设置
- 进入「第三方插件」
- 关闭安全模式(如果需要)
- 浏览插件市场
- 搜索「Obsidian Shell Commands」
- 安装并启用
基本配置
首次使用需要设置:
- 允许插件运行命令:确认安全提示
- 配置命令输出位置:选择输出显示方式
- 设置快捷键(可选)
- 配置环境变量(可选)
安全设置
OSC 提供多层安全机制:
| 设置 | 说明 |
|---|---|
| 命令白名单 | 只允许特定命令执行 |
| 确认提示 | 执行前显示确认对话框 |
| 输出限制 | 限制输出长度 |
| 超时设置 | 设置命令执行超时 |
创建命令
基本步骤
- 打开插件设置
- 点击「添加新命令」
- 设置命令名称和 ID
- 输入要执行的命令
- 设置输出选项
- 配置触发方式
- 保存命令
命令配置选项
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.toolMarkdown 转换
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 "备份和同步完成!"交互式命令
使用 zenity 或 osascript 创建对话框:
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"触发方式
快捷键
为命令绑定快捷键:
- 打开「设置」→「快捷键」
- 搜索命令名称
- 点击添加快捷键
- 按下组合键
命令面板
通过命令面板执行:
Ctrl+Shift+P → 搜索命令名称 → Enter斜杠命令
使用斜杠命令触发:
/shell:命令名称移动端
在移动端使用:
- 向下滑动打开命令面板
- 搜索 Shell 命令
- 点击执行
自动触发
配置自动触发:
yaml
自动触发:
事件: on-file-open
条件: file.extension == "md"
命令: echo "文件已打开"安全最佳实践
风险提示
使用 Shell 命令需要注意:
| 风险 | 说明 | 防护措施 |
|---|---|---|
| 命令注入 | 用户输入可能被执行 | 验证和转义输入 |
| 数据丢失 | 危险命令可能删除文件 | 先备份,再执行 |
| 权限泄露 | 命令可能访问敏感数据 | 限制命令权限 |
| 系统损坏 | 错误命令可能影响系统 | 使用沙箱环境 |
安全建议
- 使用绝对路径:避免相对路径带来的问题
bash
# 推荐
/Users/user/notes/script.sh
# 不推荐
./script.sh- 验证用户输入:处理变量时进行验证
bash
# 验证文件名
if [[ "{{file_name}" =~ ^[a-zA-Z0-9_-]+\.md$ ]]; then
echo "有效的文件名"
else
echo "无效的文件名"
exit 1
fi- 使用命令白名单:只允许特定命令执行
yaml
白名单设置:
允许的命令:
- echo
- date
- ls
- grep- 备份重要数据:执行危险命令前先备份
bash
# 备份后再删除
cp "{{file_path}}" "{{file_path}}.bak"
rm "{{file_path}}"- 错误处理:添加错误处理逻辑
bash
set -e # 命令失败时退出
set -u # 变量未定义时报错
set -o pipefail # 管道中任何命令失败时报错故障排除
命令不执行
检查以下问题:
命令语法是否正确
bash# 在终端中测试命令 echo "test"插件是否有执行权限
设置 → Shell Commands → 允许执行命令查看输出面板的错误信息
命令面板 → 显示 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 CurrentUserLinux
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 命令时务必谨慎,错误的命令可能损坏文件或系统。建议先在测试环境中验证命令,再在生产环境中使用。