Claude Code 教學/第 9 篇・共 12 篇
Hooks——讓它「每次都做到」,不是「大多做到」
你在 CLAUDE.md 交代過的事,它大多會做、偶爾會忘——連官方都承認。這篇教你 hooks:把「希望它做」變成「保證會發生」,還會拆開你可能已經在用的那個防誤刪保險給你看。
第 3 篇我們教過 CLAUDE.md:把你的習慣寫進去,它就會照做。但用久了你會發現一件事——它大多會照做,偶爾會忘。比如你交代「每次改完程式檔都要跑格式化」,十次裡它可能做九次,總有一次跳過。
這不是你寫得不好。Anthropic 官方自己在教學影片裡就承認了:
「你可以在 CLAUDE.md 裡叫 Claude 每次改完檔案都跑 prettier,大多時候它會做,但有時候不會。它不完美。」
對很多事來說,九成執行率夠用了。但有些事不行——擋掉危險指令、留下操作紀錄、改完檔一定要格式化——這種「不能失手」的事,需要另一個機制。它叫 hooks。
一、Hooks 是什麼:從「希望」變「保證」
一句話:hook 是你設定好的一段指令,在 Claude Code 工作流程的特定時點「自動、必定」執行。
跟 CLAUDE.md 的差別在哪?CLAUDE.md 是「指示」——你告訴模型該怎麼做,由它判斷、它執行,所以會有偶爾忘記的空間。hook 是「機制」——不經過模型的判斷,時點一到,系統直接執行,每一次,沒有例外。官方的說法是 hooks 是「確定性的(deterministic)」。
「生命週期(lifecycle)」聽起來很硬,其實就是「Claude Code 做一件事的流程」:你送出訊息 → 它思考 → 要用工具前 → 用完工具後 → 回答完畢。hook 就是讓你在這些節點掛上「一定會執行」的動作。
官方影片的結尾金句值得背下來:
「如果一件事必須每次都發生、不能失手——別放進 prompt,放進 hook。」
二、你可能已經在用 hooks 了
還記得第 4 篇的「防誤刪三件套」嗎?裝完之後,Claude Code 會在執行任何指令前先檢查,看到 rm -rf 這類毀滅性指令就直接拒絕。
現在可以拆開那個黑盒子了:它的底層就是一個 hook——掛在「工具執行前(PreToolUse)」這個時點的檢查程式。每次 Claude 要跑指令,這個 hook 先看一眼,危險就擋下。它為什麼擋得住?因為它不是「拜託模型記得別亂刪」(那是 CLAUDE.md 等級的希望),而是每一次執行前都有人站崗(這是 hook 等級的保證)。
所以這一篇不是教你新東西,是把你已經受惠的機制交到你自己手上。
三、動手:裝你的第一個 hook
我們裝一個最有感、又零風險的:Claude 做完事情時,電腦跳通知提醒你。適合你交辦一個要跑幾分鐘的任務、切去做別的事的場景——它做完,你馬上知道。
老規矩,你不用自己寫設定。打開 Claude Code,直接說:
幫我設定一個 hook:當你完成任務停下來等我時,
用 macOS 通知中心跳一則通知告訴我。設定完教我怎麼驗證。
它會幫你把設定寫進去。你也可以打 /hooks 打開設定介面自己看——裡面會列出目前掛了哪些 hook、掛在哪個時點。
另一個經典款是「改完檔自動格式化」:掛在「工具執行後(PostToolUse)」,指定只在「編輯或建立檔案」之後觸發,執行你慣用的格式化工具。中文圈教學有個很漂亮的驗證法:叫 Claude「建一個 HTML 檔,所有內容擠在同一行」——寫入時確實是一行,存檔後自動被格式化展開成多行。親眼看到「它寫的」和「最後存下的」不一樣,你就確定 hook 生效了。
這篇的可驗證小成果
裝好通知 hook 之後:交辦它一個要跑一陣子的任務,切到別的視窗。聽到「叮」、看到通知跳出來——成了。這就是你的第一個 hook。
四、關鍵一步:改完設定要「重啟」才生效
這是全網教學最容易漏講、卻最多人卡住的一步,先寫在這裡:
hook 設定改完,目前開著的對話不會自動載入——要離開 Claude Code、重新打開,hook 才會註冊生效。
有一支 1.6 小時的完整教學裡,講者卡了快 40 分鐘查不出 hook 為什麼不觸發,最後讓 Claude 自己診斷才發現:設定是在對話開始後才寫入的,這個 session 根本沒載入。重啟之後,立刻正常。他自己都說:「這讓我懷疑之前那些沒動靜的 hook,會不會其實只是沒重啟。」
所以卡住時的檢查順序:
- 先重啟(十之八九是這個)。
- 打
/hooks看你的 hook 有沒有出現在清單上——有列出來代表它「被看見了」。 - 還不行,把狀況描述給 Claude Code,叫它讀你的設定檔自己診斷(它真的會找出「設定是這個對話開始之後才加的」這種原因)。
五、硬規則:用 PreToolUse 把「建議」變「禁令」
進階一步。掛在「執行前」的 hook 不只能看,還能擋:它會收到「Claude 準備做什麼」的完整資訊,檢查後回覆放行或拒絕——拒絕時還能附一句原因,Claude 會收到、知道為什麼被擋、換個做法。
官方給的例子都很實在:擋掉對正式環境設定檔的寫入、擋掉含 rm -rf 的指令、擋掉直接 commit 到主分支。官方那句話講得最白:
這是給「你的團隊需要保證、而不是建議」的事用的。
比起第 4 篇教的「把危險指令列進拒絕清單」(固定名單),hook 的優勢是能寫邏輯:可以比對檔名樣式、分安全等級、每次攔截自動留一筆紀錄(出事可以回查)。名單管得住「明確知道的危險」,hook 管得住「需要判斷的危險」。
六、給團隊/多專案的兩個知識
- 設定放哪,決定誰受益:放專案裡的
settings.local.json只有你這台機器這個專案用(它會自動被排除在 git 外);放專案的settings.json會隨 git 分享給全隊——整個團隊自動有同一套護欄;放用戶層級則是你自己所有專案通用。 - 事件不只這幾個:這篇講的「送出訊息時、執行前、執行後、通知時、結束時」是最常用的五個,實際的事件清單比這更長(子代理完成、壓縮上下文前、閒置……),而且還在增加。要用到進階事件時,以官方文件的現行清單為準,別照抄舊教學。
Hooks 是這個系列「護欄思維」的最後一塊拼圖:CLAUDE.md 管「你是誰、希望怎麼做」,Skill 管「怎麼把事做好」,權限模式管「哪些事要先問」,hook 管「哪些事必定發生、哪些事絕不允許」。四層都到位,你就能放心把越來越大的事交給它。
有裝出什麼好用的 hook,歡迎跟我分享,我把它補進教學裡。
本文參考素材
- Claude(Anthropic 官方頻道):Hooks in Claude Code — https://www.youtube.com/watch?v=IkaPHiMDazM (deterministic 定調、五事件、exit code 協議、「保證不是建議」)
- ExamPro:Claude Code Hooks, Automation, and Event Workflows — https://www.youtube.com/watch?v=NTvNSIPbTTo (「改設定要重啟」的實戰教訓、除錯流程、安全防護 hook 實作與踩坑實錄)
- 马克的技术工作坊:Claude Code 从 0 到 1 全攻略 — https://www.youtube.com/watch?v=AT4b9kLtQCQ (/hooks 設定流程、格式化 hook 的一行驗證法、設定三層級)
- Claude Code 官方文件(hooks 事件清單與行為以此為準)— https://code.claude.com/docs/en/hooks-guide