在 macos shell 脚本中发送系统通知首选 osascript(零依赖、原生稳定),支持标题、副标题、消息和系统音效;进阶需求可用 terminal-notifier(需 brew 安装),支持图标、点击跳转等;均需用户授权且注意执行上下文。
在 macos 的 shell 脚本中发送系统通知弹窗,最直接、可靠的方式是调用系统原生的 osascript(无需额外安装),或者使用功能更丰富的第三方工具 terminal-notifier。两者都支持标题、副标题、消息体、声音等定制,且能触发 macos 通知中心的标准弹窗(横幅或提醒样式)。
用 osascript 发送原生通知(推荐首选)
osascript 是 macOS 自带的 AppleScript 命令行接口,零依赖、稳定、权限友好。适合大多数任务完成提示场景。
- 基础用法:弹出带标题和消息的横幅通知
osascript -e 'display notification "任务已完成" with title "脚本运行结束"' - 带副标题和自定义声音:
osascript -e 'display notification "共处理 42 个文件" with title "同步完成" subtitle "数据已更新至云端" sound name "default"' - 注意:声音名必须是系统内置音效名(如
default、bing、Pop),可在“系统设置 → 通知 → 声音”中查看可用选项
用 terminal-notifier 发送高级通知(需安装)
若需图标、点击跳转应用、交互按钮或集成到 CI/CD 流程中,terminal-notifier 更灵活。通过 Homebrew 安装:
brew install terminal-notifier
利用 macOS 原生能力实现本地语音识别与合成。通过 yap (Apple Speech.framework) 进行语音转文字,通过 say + ffmpeg 进行文字转语音。完全离线,无需 API 密钥。具备音质检测与智能选声功能。
- 简单通知:
terminal-notifier -message "构建成功" - 带标题、副标题、图标(路径需为绝对路径):
terminal-notifier -title "部署完成" -subtitle "v2.4.1" -message "已上线生产环境" -appIcon /path/to/icon.png - 点击通知后激活指定应用(如打开终端):
terminal-notifier -message "点击查看日志" -activate com.apple.Terminal
嵌入 Shell 脚本的实际写法
把通知命令放在脚本末尾,确保任务执行完毕后再触发。建议加 exit 0 前发送,避免因异常退出而跳过。
- 示例:备份脚本完成后通知
#!/bin/zsh
rsync -av ~/Documents/ /Volumes/Backup/docs/
if [ $? -eq 0 ]; then
osascript -e 'display notification "文档备份完成" with title "✅ 备份任务" subtitle "共同步 1.2GB 数据"'
else
osascript -e 'display notification "备份失败,请检查磁盘连接" with title "⚠️ 备份异常"'
fi - 小技巧:用
sleep 0.1避免某些环境下通知被吞(尤其在 Warp 等现代终端中)
注意事项与常见问题
首次运行通知时,macOS 可能弹出「是否允许此应用发送通知」权限请求,需手动点击「允许」。之后即永久生效。
- 如果通知不弹出,先检查「系统设置 → 通知 → 终端」或「osascript」是否被禁用
- 在后台运行的脚本(如 launchd 或自动操作)中调用通知,需确保以当前用户身份执行(避免 sudo 上下文丢失 GUI 权限)
- Warp 终端自带「长时间命令完成通知」功能(设置 → Notifications),如只需基础提醒,可不开发直接启用










