生活分享
Hooks:在指定事件執行檢查
Hooks(事件掛鉤)讓 Gemini CLI 在特定事件發生時執行你寫的程式。本篇用一個小型檢查器示範:在 CLI 準備呼叫 shell 工具前先回傳阻擋原因,讓練習階段保持唯讀。學完後,你會知道事件、設定與程式輸出如何接起來,以及如何分開驗證每一層。
更新日期: 閱讀時間約 5 分鐘

Hooks(事件掛鉤)讓 Gemini CLI 在特定事件發生時執行你寫的程式。本篇用一個小型檢查器示範:在 CLI 準備呼叫 shell 工具前先回傳阻擋原因,讓練習階段保持唯讀。學完後,你會知道事件、設定與程式輸出如何接起來,以及如何分開驗證每一層。
開始前:先理解事件與執行位置
準備 Gemini CLI 0.59.0、Python 與獨立練習資料夾,先讀settings.json 設定settings.json:全域、專案與環境變數settings.json 管理 Gemini CLI 的程式設定;GEMINI.md 則提供專案指示。這篇帶你辨識全域與專案設定,編輯一個最小 JSON 範例,並用實際載入結果檢查是否生效。你也會學到如何處理環境變數,避免把金鑰直接寫進可分享的設定檔。閱讀全文和shell 命令CLI 檔案與命令:@、! 與路徑Gemini CLI 可以引用檔案,也能執行作業系統命令,但這兩種輸入的效果完全不同。本篇用一份虛構公告示範 @ 檔案引用、! shell 命令、路徑與工具結果核對。學完後,你能清楚知道資料有沒有被讀取、命令有沒有執行,以及下一步應檢查哪個結果。閱讀全文。本文設定依官方 Hooks 檔案整理,Python 範例可先在終端機獨立測試;完整觸發還需要自己的 CLI 登入與工具呼叫環境。
Hook 是會在電腦上執行的程式,與純文字自訂指令自訂斜線指令:TOML、參數與重新載入自訂斜線指令可以把經常重複的提示詞存成 Gemini CLI 的快捷操作。例如每次整理公告都要保留日期、地點與缺漏資料,可以包成 /summary。本篇從不執行 shell 的純提示詞指令開始,教你建立 TOML、傳入引數、重新載入及檢查結果。閱讀全文不同。它不需要模型逐次重新理解檢查邏輯,但程式錯誤、事件選錯或設定未載入,仍會影響結果。測試時先使用假資料,將範圍縮小到單一工具,避免第一次就把複雜處理放進所有事件。
BeforeTool 發生在工具執行前,可用來判斷是否允許這次操作;AfterTool 發生在工具執行後,適合觀察結果,但不能倒轉已發生的寫入。這個時間差是選事件最重要的依據。需要阻止動作時,不能只在事後輸出一段警告。
資料流:標準輸入進來,JSON 結果出去
CLI 會把事件資料以 JSON 送到程式的標準輸入 stdin。BeforeTool 資料包含工具名稱與引數;程式透過標準輸出 stdout 回傳 JSON。除最後的 JSON 外,不要在 stdout 印出「開始檢查」等文字;診斷訊息應寫到 stderr,避免破壞解析。
本例只檢查 tool_name 是否為 run_shell_command,不試圖分析每一種 shell 語法。若符合就回傳 decision 為 deny 與原因,否則回傳 allow。這個簡單規則容易驗證,也清楚表達限制:它只處理被指定的工具,不是所有檔案操作的完整防護,仍需搭配權限與沙箱CLI 權限:忽略檔案、可信任資料夾與沙箱Gemini CLI 能讀取檔案與呼叫工具,因此開始使用前,要理解忽略檔案、資料夾信任與沙箱各控制什麼。本篇在獨立練習專案中建立 .geminiignore,檢查資料夾信任選項,再辨識啟動沙箱所需條件。完成後,你能說明每一層的用途,而不會把文字規則當成檔案存取的完整隔離。閱讀全文。
實作:建立檢查器並接上設定
- 在練習專案建立 .gemini/hooks/block-shell.py,貼上下面的 Python 程式。
- 先用兩份虛構事件測試程式,一份是 shell、一份是讀檔,核對 deny 與 allow。
- 把 hooks 物件合併到既有 .gemini/settings.json,不要覆蓋其他模型或記憶設定。
- 重新啟動 CLI,檢視 /hooks 的清單與狀態,確認設定來源及名稱。
- 請 CLI 嘗試用 shell 顯示目前資料夾,觀察掛鉤是否回傳教學設定的拒絕原因。
import json
import sys
event = json.load(sys.stdin)
if event.get("tool_name") == "run_shell_command":
result = {"decision": "deny", "reason": "本次練習禁止 shell,請改用讀檔工具。"}
else:
result = {"decision": "allow"}
json.dump(result, sys.stdout, ensure_ascii=False)
sys.stdout.write("\n")
{
"hooks": {
"BeforeTool": [
{
"matcher": "^run_shell_command$",
"hooks": [
{
"name": "lesson-block-shell",
"type": "command",
"command": "python .gemini/hooks/block-shell.py",
"timeout": 5000
}
]
}
]
}
}
'{"tool_name":"run_shell_command","tool_input":{}}' | python .gemini/hooks/block-shell.py
'{"tool_name":"read_file","tool_input":{}}' | python .gemini/hooks/block-shell.py
預期第一行回傳 deny 與原因,第二行回傳 allow。這證明檢查器邏輯與 JSON 輸出可用;還不能單憑這兩行就宣稱 CLI 已載入掛鉤。完整驗證要看到 CLI 的掛鉤狀態,並確認 shell 沒有實際執行。若 CLI 選了其他工具,表示此次沒有觸發 matcher,應重新設計測試提示詞。
判斷失敗:程式、設定與模型分開看
假如程式獨立測試成功,但 CLI 沒有顯示掛鉤,優先查設定層級與信任狀態。假如掛鉤存在卻報找不到 Python,檢查 CLI 啟動時繼承的 PATH;必要時把 command 的 Python 換成實際執行檔路徑,含空格的路徑需正確引號。不要先修改模型提示詞來修正作業系統找不到程式的問題。
官方文件定義退出碼零表示成功解析輸出,二可阻擋動作,其他非零值通常形成警告。本文採成功退出並回傳明確的 JSON 決策,較容易做測試。若要把例外視為阻擋,應刻意寫出錯誤處理並驗證;不能假設任何程式崩潰都會安全停止後續工作。
常見問題與停用方式
「加了掛鉤後每次都卡住」檢視程式是否等待第二段輸入、呼叫無法結束的外部工具,或把網路等待放進事件內。本例只讀一次 JSON 並立即輸出,適合用來比較。先縮短工作內容,再決定合理逾時;延長逾時不是修復無限等待的方法。
「回傳了 deny 還看到模型回答」拒絕的是那次工具動作,主對話仍可能繼續,模型可以解釋原因或改用其他方法。要驗證的是工具有沒有執行,而不是回答有沒有停止。需要停止整個代理迴圈時,應依對應事件的 continue 行為另行設計。
「如何恢復一般操作」先保留設定備份,從這個專案的 BeforeTool 清單移除本例,重新啟動並檢視 /hooks。再次執行相同無害測試,確認不再被此規則阻擋。別把其他人建立的檢查一起刪除,尤其是專案已有多個 Hook 的情況。
當你要把掛鉤用於正式流程,儲存事件樣本、預期輸出與錯誤測試,並記錄 CLI 版本。搭配Headless 批次處理Headless 模式:批次、JSON 與腳本Headless(非互動)模式適合把 Gemini CLI 接到腳本:輸入一段文字,取得回覆與執行狀態,再由程式決定是否儲存。本篇用虛構公告示範單次摘要與小批次處理,區分 CLI 的 JSON 外層、模型產出的文字,以及真正透過驗證的工作結果。閱讀全文時,還需確認沒有互動視窗能回答問題的情況下會如何結束,避免排程只留下空白結果卻被當作成功。
完成後的檢核
| 檢查項目 | 通過條件 |
|---|---|
| 操作 | 能依正文重做一次,說明每一步使用的輸入。 |
| 結果 | 能用原始資料或可重現測試核對輸出,而非只看語氣。 |
| 延伸 | 知道下一篇教學解決的問題,以及什麼時候需要它。 |
接著可以閱讀 CLI 權限CLI 權限:忽略檔案、可信任資料夾與沙箱Gemini CLI 能讀取檔案與呼叫工具,因此開始使用前,要理解忽略檔案、資料夾信任與沙箱各控制什麼。本篇在獨立練習專案中建立 .geminiignore,檢查資料夾信任選項,再辨識啟動沙箱所需條件。完成後,你能說明每一層的用途,而不會把文字規則當成檔案存取的完整隔離。閱讀全文、Headless 模式Headless 模式:批次、JSON 與腳本Headless(非互動)模式適合把 Gemini CLI 接到腳本:輸入一段文字,取得回覆與執行狀態,再由程式決定是否儲存。本篇用虛構公告示範單次摘要與小批次處理,區分 CLI 的 JSON 外層、模型產出的文字,以及真正透過驗證的工作結果。閱讀全文,把本篇的操作接到下一個工作流程。
返回 Gemini 教學總目錄Gemini 完整教學:電腦、手機、CLI 與 Google AI 應用這裡整理 Gemini、Google AI 與開發工具的教學。可以按分類找功能、按自己的需求走學習路線,也可以搜尋「MD」「手機」「PDF」「/memory」等關鍵字。每篇都提供步驟、可複製範例、結果核對方式與延伸閱讀,不需要從第一篇一路讀到底。閱讀全文
同主題延伸閱讀
生活分享
完整實作:文件摘要與資料擷取工具
這篇把前面學過的提示詞、API 呼叫與 JSON 驗證串成一個可執行的檔案工具。輸入一份 UTF-8 活動公告,程式產生摘要、五個固定欄位、原文引用與待確認問題,再存成待審 JSON。你會練習把模型當作資料處理的一個步驟,讓驗證與儲存仍由程式明確控制。
生活分享
API 額度與錯誤:費用、重試與成本控制
Gemini API 的費用取決於模型、輸入輸出、服務模式及使用的工具;速率限制則決定你的專案在一段時間內能送出多少工作。本篇教你找到真正對應的用量頁面、估算一次檔案處理成本、分類錯誤,並設計有限重試與停止條件,避免把每個失敗都當成多按一次就能解決。
生活分享
API 檔案與 JSON:結構化輸出及驗證
Gemini API 可以讀取 PDF,再把結果整理成指定的 JSON 結構。本篇用虛構活動公告示範檔案輸入、欄位設計與本地驗證。學完後,你會知道「收到合法 JSON」與「內容確實來自檔案」是兩件需要分別檢查的事,並能保留缺漏資訊而不讓模型自行補齊。
生活分享
AI Studio 與第一個 Gemini API 呼叫
Google AI Studio 是試用模型與建立 Gemini API 金鑰的開發入口。本篇從一個簡單提示詞開始,帶你建立獨立專案環境,分別用 Python 與 JavaScript 呼叫 API。完成後,你會知道網頁試跑、程式執行與帳號用量各自在哪裡確認,不再把消費者版 Gemini 的操作直接套程式式。
引用本文的文章
最新旅遊情報攻略

情報
2026 韓國楓葉預測:雪嶽山 10 月 20 日、首爾近郊 10 月底、內藏山與漢拏山 11 月上旬
韓國山林廳 2026 年 9 月 22 日公布的楓紅高峰預測:雪嶽山 10 月 20 日,春川、國立樹木園到首爾植物園落在 10 月 28 日到 11 月 2 日,內藏山 11 月 4 日、漢拏山 11 月 6 日,整體比最近 5 年晚約 0.8 天。整理各地楓樹與銀杏的預測日、首爾出發怎麼排,以及出發前去哪裡看即時楓況。2026 年 10 月查證。
- 季節活動
- 自然
- 觀景

攻略胡志明市
胡志明市到頭頓一日遊:白藤碼頭搭高速船、船票與班次,下船就是胡梅纜車與耶穌基督像
人在胡志明市挪一天去頭頓看海:市中心的白藤高速船碼頭搭船,航程 120 分鐘到頭頓的胡梅碼頭,平日成人 320,000 越南盾、週末 350,000,回程末班平日 15:00。下船就是胡梅纜車站,同一條路上有白宮,小山頂上是耶穌基督像。平日一天只有兩班船,整天要從末班船倒推著排。
- 交通
- 行程範例
- 海灘

攻略沖繩
沖繩不開車攻略:單軌只到浦添,美麗海水族館要坐兩個多小時的巴士,回那霸的最後一班直達車 17:22 就開走
不租車的沖繩怎麼移動:那霸市區靠沖繩都市單軌電車(ゆいレール),那霸機場站到終點てだこ浦西 19 站、17 公里、37 分鐘,一日券 1,000 日圓;美麗海水族館有那霸機場直達的高速巴士,單程 2,000 日圓起、官方時刻表上 2 小時上下,下車後還要走 10 分鐘;古宇利島要在今帰仁村役場轉車,當天來回光坐車就六個半小時;回程的最後一班直達車 17:22 就從記念公園前開走(2026 年 9 月查證)。
- 交通
- 行程範例
- 預算
資料來源
- Gemini CLI:Hooks · 查證日期:
- Gemini CLI:Hooks 事件規格 · 查證日期: