06 - 非互動模式:codex exec

05-AGENTS-md與config-toml | 00-Index | 下一篇 → 07-MCP與擴充


基本用法

codex exec "把 tools/validate.py 的錯誤訊息改成繁體中文"
codex e "同上"                     # e 是 exec 的別名

非互動模式讓你從腳本執行 Codex,不開互動 TUI——CI job、批次處理、被別的 agent 呼叫時用。

這是 Codex 的「headless 模式」,對應 Claude Code 的 claude -p


核心旗標

旗標作用
--json串流 JSONL 事件到 stdout(每行一個 JSON)
-o, --output-last-message <FILE>把最後一則 agent 訊息以純文字寫進檔案
--skip-git-repo-check跳過「必須在 git repo 裡」的守衛
--full-auto不問核准 + 強制 workspace-write sandbox
--profile <name>config.toml 裡的某個 profile

-o 的行為值得知道

-o 不管有沒有 --json 都會把最後一則 agent 訊息以文字捕捉起來。輸出會同時出現在 stdout 和那個檔案

也就是說 -o 是「額外寫一份」,不是「改寫去哪」。

codex exec -o /tmp/result.txt "分析這個 repo 的測試覆蓋率"
cat /tmp/result.txt

💡 這解決了 Herdr 讀不到長輸出 的問題——與其從終端畫面撈,不如讓它寫檔然後讀檔。


JSONL 串流

codex exec --json "審查目前的 diff" > events.jsonl

每行一個 JSON 事件,適合:

  • CI 裡解析執行過程
  • 做進度條 / 監看 UI
  • 事後分析它做了什麼

搭配 jq 過濾:

codex exec --json "..." | jq -r 'select(.type == "message") | .content'

⚠️ 實際的事件 schema 依版本而異,先跑一次看看實際輸出長什麼樣再寫解析邏輯。


codex exec resume

codex exec 也支援續接之前的 session:

codex exec resume "接著把剩下的檔案也處理掉"

用途:把一個大任務拆成好幾個 codex exec 呼叫,但保留脈絡。


CI 整合範例

# .github/workflows/codex-review.yml(示意)
- name: Codex review
  run: |
    codex exec --json --profile ci \
      -o /tmp/review.md \
      "審查這次 PR 的 diff,只回報可執行的問題" \
      > /tmp/events.jsonl
    cat /tmp/review.md >> "$GITHUB_STEP_SUMMARY"

CI 的正確設定:

設定理由
approval_policyuntrusted(或至少 never無人值守,不能停下來等人
sandbox_modeworkspace-write讓它能改,但寫不出 repo
network_access依需要不需要就關

📌 官方對 CI 的建議是 untrusted 是無人值守 CI 與正式環境的正確預設——只有可信指令能直接跑,其他的直接失敗並把結果回給模型。


給你的實用腳本

1. 批次格式稽核(vault)

#!/usr/bin/env bash
# audit-vault.sh — 用唯讀 profile 掃描筆記格式問題
set -euo pipefail
 
for dir in "Nephrology(NEP)" "Cardiology(CV)" "Endocrinology(ENDO)"; do
  echo "=== $dir ==="
  codex exec --profile audit \
    -o "/tmp/audit-${dir}.md" \
    "掃描 '$dir' 底下所有 *_overview.md:
     1. YAML frontmatter 是否合法
     2. 是否有 modified 欄位
     3. 是否有用 ![](assets/...) 這種會讓 Quartz 破圖的寫法(應該用 ![[檔名]])
     只回報問題,格式為表格。**你在 read-only sandbox 裡,本來就改不了檔案。**"
done
 
cat /tmp/audit-*.md

設計重點--profile auditread-only + never——作業系統層級保證它改不到你的筆記,比在 prompt 裡寫「不要改」可靠得多。

2. 詳解量產(刷題網站)

#!/usr/bin/env bash
# draft-explanations.sh <任務檔>
set -euo pipefail
 
task="${1:?需要任務檔}"
out="tmp_drafts/out/$(basename "$task" .task.md).json"
 
codex exec --profile worker \
  -o "/tmp/$(basename "$task" .task.md).log" \
  "$(cat "$task")"
 
# 驗收:看檔案,不看 agent 說什麼
test -f "$out" || { echo "❌ 沒產出 $out"; exit 1; }
jq empty "$out" || { echo "❌ JSON 不合法"; exit 1; }
echo "✅ $(jq 'length' "$out") 題"

驗收看檔案不看狀態,這跟 Herdr 08 的鐵律一致。


codex exec vs claude -p 對照

claude -pcodex exec
別名codex e
JSON 輸出--output-format json--json(JSONL)
Schema 保證--json-schema⚠️ 無等價功能
存最終回覆自己導向-o <file>
續接--continue / --resumecodex exec resume
花費上限--max-budget-usd⚠️ 無等價功能
輪數上限--max-turns⚠️ 無等價功能
極簡啟動--bare
權限--permission-mode--full-auto / --profile

🔑 兩個明顯的差異值得記住

  1. Claude Code 有 --json-schema 保證輸出格式,Codex 沒有 → Codex 的輸出契約要靠 prompt 約定和事後驗證
  2. Claude Code 有 --max-budget-usd,Codex 沒有 → Codex 跑失控時沒有內建的花費煞車,要靠你自己控制範圍和批次大小。

🔗 相關筆記


最後更新:2026-08-04