在上一篇文章《Codex CLI 快速入门》中,我们介绍了 Codex CLI 的安装、登录和基本交互式使用。但 Codex 的真正威力远不止于此——它还提供了一个强大的非交互模式 codex exec,让你可以在脚本、CI/CD 流水线、以及各种自动化场景中调用 AI 编程能力。
本文将深入探讨 codex exec 命令的使用方法,通过实际案例展示如何将 AI 编程助手集成到你的日常工作流中,实现真正的编程自动化。
codex exec 是 Codex CLI 提供的非交互式执行模式。与默认的 TUI 交互界面不同,exec 模式接收一段提示词(prompt),AI 模型会直接执行相应的操作并将结果输出到终端,整个过程无需人工介入,非常适合自动化场景。
这种模式特别适合以下几种场景:
确保你已经安装了 Codex CLI。安装方式有两种:
# macOS / Linux — 官方安装脚本 curl -fsSL https://raw.githubusercontent.com/openai/codex/main/install.sh | bash # 通过 npm 全局安装 npm install -g @openai/codex
安装完成后进行认证:
codex login
这会打开浏览器完成 OpenAI 账号的授权流程。如果你在无头服务器上运行,可以使用 API Key 的方式:
codex login --api-key
codex exec "你的提示词" [选项]
举个最简单的例子——让 Codex 解释一个文件的作用:
codex exec "解释当前目录下 main.go 文件的核心逻辑和架构设计"
Codex 会读取文件内容、分析代码逻辑,然后将解读结果直接输出到终端。
| 选项 | 说明 |
|------|------|
| --model <name> | 指定使用的模型,如 gpt-4o、gpt-4o-mini、o3-mini |
| --sandbox | 在沙箱模式下运行,隔离文件系统操作,避免影响宿主机 |
| --approval-mode <mode> | 审批模式:auto(默认,危险操作需确认)、always(全部确认)、never(跳过所有确认) |
| --no-truncation | 禁止截断输出内容,适合需要完整结果的场景 |
| --json | 以 JSON 格式输出结构化的结果,方便程序化处理 |
| --max-turns <n> | 限制 AI 的最大交互轮数,控制成本和执行时间 |
| --continue | 继续上一次的对话,适用于多步骤的复杂任务 |
示例——在沙箱中安全地生成项目:
codex exec "创建一个 Express.js REST API 项目骨架,包含用户认证模块" \ --model gpt-4o \ --sandbox
在每次提交前,自动检查暂存区代码的质量问题。创建一个 scripts/review.sh:
#!/bin/bash
# 自动代码审查脚本
FILES=$(git diff --cached --name-only --diff-filter=ACM 2>/dev/null)
if [ -z "$FILES" ]; then
exit 0
fi
HAS_ISSUES=0
for file in $FILES; do
echo "=== 审查文件: $file ==="
codex exec "审查文件 $file 中的代码变更,请重点关注:
1. 潜在的安全漏洞(SQL 注入、XSS、路径遍历等)
2. 明显的逻辑错误或边界条件遗漏
3. 错误处理是否完善
4. 是否有硬编码的敏感信息
请用中文输出审查结果,列出发现的问题和修复建议。" \
--approval-mode never \
--model gpt-4o-mini
if [ $? -ne 0 ]; then
HAS_ISSUES=1
fi
echo ""
done
if [ $HAS_ISSUES -eq 1 ]; then
echo "⚠️ 代码审查发现问题,请检查上述输出。"
echo "你可以运行 git commit --no-verify 跳过审查。"
exit 1
fi
echo "✅ 代码审查通过!"
注册到 Git hook:
# 复制脚本到 .git/hooks 目录 cp scripts/review.sh .git/hooks/pre-commit chmod +x .git/hooks/pre-commit
当需要将整个项目的回调风格改为 async/await 时,逐一修改太过耗时。配合 find 和 codex exec 可以批量处理:
# 批量将回调模式改为 async/await
find src -name "*.js" -not -path "*/node_modules/*" | while read file; do
echo "处理: $file"
codex exec "将文件 $file 中的回调函数模式(callback、.then())重构为 async/await。
要求:
- 保持所有原有功能不变
- try/catch 包裹可能出错的操作
- 不改动任何测试文件
- 不改动第三方库的调用方式" \
--model gpt-4o \
--approval-mode auto
done
在 CI 流水线中自动生成 PR 变更摘要,帮助 reviewer 快速理解改动内容:
# .github/workflows/pr-summary.yml
name: AI PR Summary
on:
pull_request:
types: [opened, synchronize]
jobs:
summarize:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Codex
run: npm install -g @openai/codex
- name: Login to Codex
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: echo "$OPENAI_API_KEY" | codex login --api-key
- name: Generate PR Summary
run: |
git diff origin/${{ github.base_ref }}...HEAD > /tmp/pr.diff
codex exec "分析 /tmp/pr.diff 中的完整代码变更,生成一份中文 PR 摘要,包含:
1. 变更概述:这次 PR 做了什么
2. 主要修改点:按文件或模块列出关键改动
3. 潜在影响区域:哪些功能可能受此次变更影响
4. 测试建议:reviewer 应重点测试的场景" \
--no-truncation \
--model gpt-4o > pr_summary.md
- name: Post Summary
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const summary = fs.readFileSync('pr_summary.md', 'utf8');
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: summary
});
不用再手动创建项目目录结构,让 Codex 帮你搞定:
codex exec "在 ./user-service 目录下创建一个 Go 微服务项目,包含: 1. 标准的 Go 项目目录布局(cmd/、internal/、pkg/、migrations/) 2. 一个 gRPC 服务定义文件 proto/user.proto 3. 使用 golang-migrate 的数据库迁移脚本 4. Dockerfile 和 docker-compose.yml(包含 PostgreSQL) 5. Makefile(build、test、lint、migrate-up、migrate-down) 6. README.md 包含本地开发和部署说明 7. .golangci.yml 配置" \ --model gpt-4o \ --approval-mode auto
AGENTS.md 是 Codex 的项目级指令文件,放在项目根目录。exec 模式同样会解析这个文件中的指令,确保 AI 在自动化场景下也遵循你的团队规范。
# AGENTS.md
## 技术栈
- 后端:Go 1.22+,使用 net/http 标准库
- 数据库:PostgreSQL 16,驱动 pgx/v5
- 缓存:Redis 7,驱动 go-redis/v9
- 日志:标准库 log/slog
## 代码规范
- 所有导出函数必须有 godoc 注释
- 错误处理:使用 `fmt.Errorf("context: %w", err)` 包装
- 不使用 panic,所有错误向上传播
- HTTP handler 只做参数解析和响应,业务逻辑放 service 层
- 单元测试使用 testing 标准库 + testify/assert
## 数据库规范
- 表名:蛇形命名,复数形式
- 主键:UUID v7,字段名 id
- 时间字段:created_at、updated_at,类型 TIMESTAMPTZ
- 迁移文件命名:{序号}_{描述}.up.sql 和 {序号}_{描述}.down.sql
## API 规范
- RESTful 风格,资源名使用复数
- 请求/响应统一使用 JSON
- 错误响应格式:{"error": {"code": "xxx", "message": "yyy"}}
配置好 AGENTS.md 后,exec 模式会自动遵循这些约定:
# Codex 会按规范创建 handler + service 分层代码 codex exec "添加用户注册接口 POST /api/v1/users/register, 字段包括邮箱、密码、昵称。密码需要 bcrypt 加密存储。"
如果多个项目有共同的规范,可以在 ~/.config/codex/AGENTS.md 中定义全局规则,项目级的 AGENTS.md 会自动合并:
# 全局 AGENTS.md mkdir -p ~/.config/codex # 将团队的通用规范写入 ~/.config/codex/AGENTS.md
将 codex exec 的输出与后续命令串联:
# 生成测试代码并直接运行 codex exec "为 internal/handler/user.go 中的所有 HTTP handler 生成表驱动测试" \ --model gpt-4o \ | tee internal/handler/user_test.go \ && go test ./internal/handler/ -v -count=1
#!/bin/bash
# auto-fix.sh — 自动修复 lint 问题
LINT_OUTPUT=$(golangci-lint run --out-format json 2>&1)
if [ -n "$LINT_OUTPUT" ]; then
echo "发现 lint 问题 $(echo "$LINT_OUTPUT" | jq '.Issues | length') 个,正在自动修复..."
echo "$LINT_OUTPUT" | jq '.Issues' > /tmp/lint.json
codex exec "分析 /tmp/lint.json 中的 golangci-lint 输出(JSON 格式),
对每个 issue 给出修复方案并应用到源文件。
修复完成后运行 'golangci-lint run' 验证结果。" \
--approval-mode auto
echo "修复完成,请用 git diff 检查变更。"
else
echo "✅ 代码检查通过!"
fi
# 以结构化方式获取代码分析结果 codex exec "分析 src/ 目录下所有 Go 文件的复杂度, 输出每个文件圈复杂度最高的 3 个函数及对应的复杂度值。" \ --json \ --model gpt-4o-mini > complexity_report.json # 用 jq 过滤复杂度超过 10 的函数 jq '.[] | select(.complexity > 10)' complexity_report.json
对于复杂的多步骤任务,使用 --continue 保持上下文:
# 第一步:设计数据库表结构 codex exec "为电商系统设计以下表结构:users、products、orders、order_items" # 第二步:基于上一步的表结构,生成迁移文件 codex exec --continue "根据上面设计的表结构,生成 PostgreSQL 迁移脚本"
审批模式慎用:生产环境中避免使用 --approval-mode never,尤其是在涉及文件写入或命令执行时。建议在 CI 中先使用 auto 模式,确认安全后再调整。
成本控制:每次 exec 调用都消耗 API credit。建议对简单任务使用 gpt-4o-mini 模型,复杂任务再切换 gpt-4o。通过 --max-turns 限制交互轮数也可以有效控制成本。
沙箱先行:在操作实际项目文件前,先用 --sandbox 模式验证 AI 的输出是否符合预期。
重试机制:在脚本中调用 exec 时,建议添加重试逻辑,应对偶发的网络或 API 错误:
```bash
retry_codex() {
local max_retries=3
local retry_count=0
until codex exec "$@"; do
retry_count=$((retry_count + 1))
if [ $retry_count -ge $max_retries ]; then
echo "重试 $max_retries 次后仍然失败"
return 1
fi
sleep $((2 ** retry_count))
done
}
```
敏感信息保护:确保 .codexignore 文件中排除了 .env、密钥文件等敏感内容,防止被 AI 读取。
```
# .codexignore
.env
.env.*
*.pem
*-key.json
secrets/
```
codex exec 让 Codex 从一款交互式编程助手升级为可编排的自动化工具。它打通了 AI 编程能力与 DevOps 工作流的壁垒——你可以把它放进 Git hook 审代码、放入 CI 流水线生成摘要、嵌入脚本批量重构、甚至用它一键生成项目脚手架。
配合 AGENTS.md 的项目级配置,你能确保 Codex 在任何自动化场景下都严格遵循团队规范,让 codex exec 真正成为开发流程中值得信赖的自动化伙伴。
在下一篇文章中,我们将深入探讨 Codex 的 Sandbox 沙箱模式,了解如何在完全隔离的环境中安全运行 AI 生成的代码,以及如何将沙箱模式与 exec 命令结合,打造零风险的自动化实验环境。