Claude Code 通知:分辨它是在等你还是已经完成

“被阻塞的会话和已完成的会话看起来一模一样,结果我先打开了错的那个。”Claude Code 的一条功能请求中的这句话道出了问题所在。下面介绍如何为两种情况分别获得不同的信号。

作者:Aslan,Pet Island 团队 · 更新于 2026年10月26日 · 阅读时长 4 分钟

简短回答

当你不在时,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 等其他终端中,除非你进行设置,否则不会有任何可见的提示。

最简单的办法是使用终端响铃:

~/.claude/settings.json复制
{
"preferredNotifChannel": "terminal_bell"
}

响铃的效果由你的终端决定。在 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 需要权限时播放高音双响,在完成时播放一声低音:

%USERPROFILE%\.claude\settings.json复制
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{ "type": "command", "shell": "powershell",
"command": "[Console]::Beep(1320, 150); [Console]::Beep(1320, 150)" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "shell": "powershell",
"command": "[Console]::Beep(660, 300)" }
]
}
]
}
}

Console.Beep 接收以赫兹为单位的频率和以毫秒为单位的时长,并会等到响声结束。Anthropic 的 hook 指南还给出了一个用 System.Windows.Forms 弹出消息框的 Windows 示例;他们自己也注明,那是一个对话框而不是通知,而且可能在终端后面打开。

macOS 和 Linux

Anthropic 的文档在 macOS 上使用 afplay:

~/.claude/settings.json复制
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }]
}
],
"Stop": [
{
"hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Pop.aiff" }]
}
]
}
}

如需可见的提醒,在 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日 对照以下页面核实。智能体更新很快;如有不符,以官方页面为准。

继续阅读

在屏幕顶部回应每一个智能体。

Windows 和 Mac · 免费试用 7 天,之后一次性支付 8.99 美元 · 每笔销售拿出 1 美元为流浪动物提供食物

免费试用 Pet Island