Claude Code 通知:分辨它是在等你还是已经完成
“被阻塞的会话和已完成的会话看起来一模一样,结果我先打开了错的那个。”Claude Code 的一条功能请求中的这句话道出了问题所在。下面介绍如何为两种情况分别获得不同的信号。
简短回答
当你不在时,Claude Code 在完成任务或等待权限时本来就会发出通知,但默认只有 Ghostty、Kitty 和 iTerm2 会将其显示为桌面通知。在其他终端中,请设置 "preferredNotifChannel": "terminal_bell"。如果想要两种不同的声音,用带 permission_prompt matcher 的 Notification hook 表示“需要你”,用 Stop hook 表示“已完成”。
Claude Code 自带的行为
当 Claude 完成一项任务或因权限提示而暂停,而你看起来不在终端前时,它会触发一个通知事件。默认情况下,只有在 Ghostty、Kitty 和 iTerm2 中它才会转为桌面通知。在 Windows Terminal、VS Code 终端、Warp 等其他终端中,除非你进行设置,否则不会有任何可见的提示。
最简单的办法是使用终端响铃:
响铃的效果由你的终端决定。在 Windows Terminal 中,bellStyle 设置可以是 audible(默认)、window、taskbar、all 或 none。设为 all 时,Windows Terminal 会播放声音并让任务栏图标闪烁。
- iTerm2:Settings → Profiles → Terminal → 勾选“Notification Center Alerts”,然后在 Filter Alerts 中启用“Send escape sequence-generated alerts”。
- tmux:在
~/.tmux.conf中添加set -g allow-passthrough on,否则通知永远到达不了外层终端。 - 通过 SSH:桌面通知会传回你的本地计算机,因此远程会话同样可以提醒你。
关于系统通知的功能请求(#26581,34 个赞)已以“功能已存在”为由关闭,指向的正是这个内置通知。而为“等待中”和“已完成”提供不同信号的请求(#94373)仍未关闭。这时就需要用到 hook。
两个事件:Notification 和 Stop
Notification在 Claude Code 发送通知时触发。它的 matcher 是通知类型。你需要关注的两种是permission_prompt(Claude 需要你批准某次工具调用,且提示已等待约六秒)和idle_prompt(Claude 大约 60 秒前已完成回复,而你此后一直没有输入)。Stop在 Claude 每次完成回复时触发。你主动中断时不会触发;API 错误则会触发StopFailure。
hook 与内置通知同时运行,不会取而代之,所以两者可以并存。
Windows:两种不同的声音
在 Windows 上,hook 在 Git Bash 中运行;没有安装 Git Bash 时则在 PowerShell 中运行。设置 "shell": "powershell" 可以消除不确定性。以下配置会在 Claude 需要权限时播放高音双响,在完成时播放一声低音:
Console.Beep 接收以赫兹为单位的频率和以毫秒为单位的时长,并会等到响声结束。Anthropic 的 hook 指南还给出了一个用 System.Windows.Forms 弹出消息框的 Windows 示例;他们自己也注明,那是一个对话框而不是通知,而且可能在终端后面打开。
macOS 和 Linux
Anthropic 的文档在 macOS 上使用 afplay:
如需可见的提醒,在 macOS 上使用 osascript -e 'display notification "Claude needs you" with title "Claude Code"',在 Linux 上使用 notify-send "Claude Code" "Claude needs you"。
能帮你省下一个晚上的细节
- Stop 触发得很频繁。 每次 Claude 完成回复都会触发,而不只是在整个任务完成时。如果觉得太吵,请改用
idle_prompt通知。它会等待约一分钟,并且只在你没有输入时才触发。 - 需要时读取事件内容。 Notification 的输入包含
message、title和notification_type,因此脚本可以显示具体的请求内容。 - Agent view。 如果你用
claude agents运行后台会话,当某个会话开始需要输入、完成或失败时,它会通过同一个preferredNotifChannel通知你,并以agent_needs_input或agent_completed类型触发 Notification hook。 - 终端状态。 实现了 OSC 7501 状态协议的终端可以显示每个 Claude Code 会话是在工作、等待还是已完成。Claude Code v2.1.295 或更高版本会自动报告该状态。
- hook 在 Windows 上不触发? 请参阅 Claude Code hook 在 Windows 上不起作用。罪魁祸首几乎总是 shell。
看清是哪个会话,并直接回应
提示音只能告诉你发生了什么事,却无法告诉你它来自三个终端中的哪一个,也无法告诉你 Claude 想运行什么。Pet Island 在屏幕顶部的小岛上为每个 Claude Code 会话留出一个位置:工作中、等你处理或已完成。权限请求会连同命令或 diff 一起到达,你当场就能允许或拒绝;提问和计划也是如此。想仔细查看时,点击一下就能跳到对应的终端。
常见问题
Claude Code 有通知功能吗?
有。当你不在时,它完成任务或等待权限都会触发通知。Ghostty、Kitty 和 iTerm2 默认将其显示为桌面通知;在其他终端中,请将 preferredNotifChannel 设为 "terminal_bell",或添加 Notification hook。
如何在 Claude Code 完成时听到提示音?
添加一个播放声音的 Stop hook,例如在 macOS 上用 afplay,在 Windows 上用 PowerShell 中的 [Console]::Beep。
如何区分“需要权限”和“已完成”?
用带 permission_prompt matcher 的 Notification hook 播放一种声音,用 Stop hook 播放另一种声音。
为什么我在 Windows Terminal 或 VS Code 中收不到通知?
Claude Code 默认只在 Ghostty、Kitty 和 iTerm2 中发送桌面通知。请将 preferredNotifChannel 设为 "terminal_bell",或使用 hook。
通知在 tmux 中能用吗?
能,前提是在 ~/.tmux.conf 中添加 set -g allow-passthrough on。
参考来源
本页的每项设置和行为都已于 2026年10月26日 对照以下页面核实。智能体更新很快;如有不符,以官方页面为准。
- Claude Code 文档:Configure your terminal(通知)
- Claude Code 文档:Hooks guide
- Claude Code 文档:Hooks reference
- Claude Code 文档:Agent view
- Issue #26581:Claude 需要关注时发送系统通知
- Issue #94373:对等待中和已完成发出不同的通知
- Issue #2427:任务完成时发出声音通知
- Microsoft Learn:Windows Terminal 配置文件设置(bellStyle)
- Microsoft Learn:Console.Beep