打印模式(`-p` 或 `--print`)是 Claude Code 的非交互式执行模式,适用于自动化脚本、CI/CD 流水线、批量文件处理等场景。本文将深入探讨打印模式的完整用法,包括 JSON 输出格式化、管道处理、超时控制、错误处理和 CI 集成最佳实践。

Claude Code 打印模式 (-p) — 非交互式单任务最佳实践

简介

打印模式(-p--print)是 Claude Code 的非交互式执行模式,适用于自动化脚本、CI/CD 流水线、批量文件处理等场景。本文将深入探讨打印模式的完整用法,包括 JSON 输出格式化、管道处理、超时控制、错误处理和 CI 集成最佳实践。

与交互模式不同,打印模式的设计理念是"一次输入、一次输出、立即退出"。这种模式特别适合那些不需要多轮对话的场景——比如代码审查、文档生成、批量重构等任务。想象一下,你希望每次提交代码后自动运行一次审查,或者每晚定时生成项目文档,这些场景下交互模式显得笨重,而打印模式则提供了简洁而强大的解决方案。

理解打印模式的工作原理和最佳实践,能让你将 Claude Code 从一个交互式编程助手转变为一个强大的自动化工具。本文将从最基础的语法讲起,逐步深入到复杂的 CI 集成和管道编排,帮助你构建可靠的自动化工作流。

目录

一、打印模式基础

1.1 基本语法

bash
# 最基本用法
claude -p "你的任务描述"

# 带长选项
claude --print "解释 src/main.py 中的核心逻辑"

# 指定工作目录
claude -p "分析项目结构" --cwd /path/to/project

# 指定模型
claude -p "优化这段代码" --model claude-opus-4-20250514

1.2 打印模式与交互模式的区别

理解打印模式与交互模式的区别,是正确选择使用场景的前提。打印模式本质上是一个"无状态"的执行引擎——它接收输入、执行任务、输出结果、然后退出。这种设计使得打印模式非常适合脚本化和自动化场景。相比之下,交互模式是有状态的,它维护完整的对话历史,支持多轮对话和上下文引用。

值得注意的是,打印模式在工具调用方面默认采用"自动执行"策略,即 Claude Code 可以自主调用读取、编辑、执行等工具,无需用户逐一确认。这意味着在使用打印模式时,权限配置尤为重要——你应该通过白名单机制限制 Claude 可以执行的操作范围,避免意外的破坏性操作。

特性 打印模式 (-p) 交互模式 (默认)
输入方式 命令行一次性传入 终端交互式多轮对话
输出方式 一次性输出到 stdout 流式输出到 TUI
适用场景 脚本、CI/CD、自动化 开发调试、探索性编程
工具调用 自动执行 需要用户确认(默认)
上下文保持 单次任务结束即清除 持续保持多轮对话

1.3 实战示例

bash
# 示例 1: 代码解释
claude -p "解释以下代码的功能和潜在问题" \
  --file src/auth.py \
  > explanation.txt

# 示例 2: 代码重构
claude -p "将以下函数重构为异步版本" \
  --file src/data_loader.py \
  --file src/data_processor.py \
  > refactored.py

# 示例 3: 文档生成
claude -p "为以下模块生成 API 文档" \
  --file src/api/routes.py \
  --format markdown \
  > API_DOCS.md

二、输出格式控制

2.1 纯文本输出(默认)

bash
claude -p "列出所有 Python 文件并统计行数" --format text

2.2 Markdown 输出

bash
claude -p "生成 README 文档" --format markdown > README.md

2.3 JSON 输出

bash
claude -p "分析代码质量" --format json > report.json

2.4 HTML 输出

bash
claude -p "生成代码审查报告" --format html > report.html

三、JSON 输出深度解析

3.1 JSON 输出结构

JSON 输出是打印模式最强大的功能之一。通过将输出格式化为结构化的 JSON 数据,你可以轻松地与其他工具集成——无论是用 jq 提取特定字段,还是用 Python 脚本进行进一步处理,JSON 格式都提供了最大的灵活性。输出结构包含四个主要部分:类型标识、成功状态、输出内容和元数据。其中元数据部分特别有用,它记录了模型信息、token 用量、执行时长和估算成本,这些数据对于监控和优化 CI 流水线的资源消耗至关重要。

json
{
  "type": "result",
  "success": true,
  "output": {
    "text": "分析完成...",
    "tool_calls": [
      {
        "tool": "Read",
        "input": { "path": "src/main.py" },
        "output_preview": "import os\n..."
      }
    ]
  },
  "metadata": {
    "model": "claude-sonnet-4-20250514",
    "usage": {
      "input_tokens": 1250,
      "output_tokens": 450,
      "cache_creation_tokens": 0,
      "cache_read_tokens": 0
    },
    "duration_ms": 3200,
    "cost_usd": 0.0042
  }
}

3.2 解析 JSON 输出

bash
# 使用 jq 提取关键信息
claude -p "分析代码" --format json | jq '.output.text'

# 提取工具调用记录
claude -p "分析代码" --format json | jq '.output.tool_calls[].tool'

# 提取 token 用量
claude -p "分析代码" --format json | jq '.metadata.usage'

# 提取成本信息
claude -p "分析代码" --format json | jq '.metadata.cost_usd'

3.3 批量处理脚本

bash
#!/bin/bash
# batch-review.sh — 批量代码审查

FILES=$(find src/ -name "*.py" -type f)
RESULTS=()

for file in $FILES; do
  echo "🔍 审查: $file"
  result=$(claude -p "审查以下代码的安全性、性能和可读性问题" \
    --file "$file" \
    --format json 2>/dev/null)

  issues=$(echo "$result" | jq -r '.output.text')
  cost=$(echo "$result" | jq '.metadata.cost_usd')

  RESULTS+=("{\"file\": \"$file\", \"issues\": $(echo "$issues" | jq -Rs .), \"cost\": $cost}")
done

# 汇总报告
echo "${RESULTS[@]}" | jq -s '{
  total_files: length,
  total_cost: (map(.cost) | add),
  results: .
}' > review-summary.json

echo "✅ 审查完成! 详见 review-summary.json"

四、管道处理与流式输出

4.1 从标准输入读取

bash
# 管道输入
cat src/main.py | claude -p "这段代码有什么问题?如何改进?"

# 多文件管道
find src/ -name "*.py" -exec cat {} + | claude -p "找出所有潜在的内存泄漏"

# Git diff 管道
git diff HEAD~1 | claude -p "审查这些变更,指出潜在问题"

4.2 流式输出到文件

bash
# 实时写入文件(适用于长时间任务)
claude -p "生成完整的项目文档" --stream > docs.md

# 同时显示和保存
claude -p "分析项目架构" | tee architecture-analysis.md

4.3 管道串联

bash
# 先提取代码,再审查,最后生成报告
git diff --name-only HEAD~1 \
  | xargs -I {} cat {} \
  | claude -p "审查代码变更" \
  | claude -p "将上述审查结果整理为结构化报告,包含:问题分类、严重程度、修复建议" \
  > final-review.md

五、超时与错误处理

超时控制是打印模式在自动化场景中的关键配置。没有超时限制的任务可能会因为网络延迟、模型响应慢或任务过于复杂而无限期挂起,这会阻塞 CI 流水线或导致资源浪费。合理的超时设置应该在"给 Claude 足够的时间完成复杂任务"和"避免无限等待"之间找到平衡。

错误处理策略则决定了当 Claude 执行失败时如何恢复。常见的错误类型包括:认证失败(API Key 过期)、API 限流(请求频率过高)、超时(任务过于复杂)和权限拒绝(触发了安全限制)。针对每种错误类型,应该有相应的处理策略。

5.1 超时控制

bash
# 设置超时时间(秒)
claude -p "分析整个项目架构" --timeout 300

# 超时后的行为
# 默认: 返回已生成的内容
# 使用 --strict-timeout: 超时即失败
claude -p "深度分析" --timeout 60 --strict-timeout

5.2 错误处理策略

bash
#!/bin/bash
# safe-claude.sh — 带错误处理的封装脚本

set -euo pipefail

TIMEOUT=${CLAUDE_TIMEOUT:-120}
RETRIES=${CLAUDE_RETRIES:-3}

run_claude() {
  local prompt="$1"
  local attempt=1

  while [ $attempt -le $RETRIES ]; do
    echo "⏳ 尝试 $attempt/$RETRIES..."

    if claude -p "$prompt" \
      --timeout $TIMEOUT \
      --format json \
      --output "claude-result.json" 2>claude-error.log; then
      echo "✅ 成功"
      return 0
    fi

    echo "❌ 失败,错误信息:"
    cat claude-error.log

    if [ $attempt -lt $RETRIES ]; then
      delay=$((attempt * 5))
      echo "⏱️ 等待 ${delay}s 后重试..."
      sleep $delay
    fi

    attempt=$((attempt + 1))
  done

  echo "💥 所有重试均失败"
  return 1
}

# 使用示例
run_claude "审查 src/ 目录下所有文件的代码质量"

5.3 退出码说明

退出码 含义
0 成功完成
1 通用错误
2 认证失败
3 超时
4 权限被拒绝
5 API 限流
bash
claude -p "执行任务"
exit_code=$?

case $exit_code in
  0) echo "成功" ;;
  2) echo "认证失败,请运行 claude auth login" ;;
  3) echo "超时,请增加 --timeout 参数" ;;
  4) echo "权限被拒绝,检查 dangerously-skip-permissions" ;;
  5) echo "API 限流,请稍后重试" ;;
  *) echo "未知错误: $exit_code" ;;
esac

六、CI/CD 集成实战

6.1 GitHub Actions 完整示例

yaml
name: Claude Code Review
on:
  pull_request:
    branches: [main]

jobs:
  code-review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Get Changed Files
        id: changes
        run: |
          echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | tr '\n' ',')" >> $GITHUB_OUTPUT

      - name: Run Claude Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude -p "
            作为高级代码审查员,审查以下变更文件:
            ${{ steps.changes.outputs.files }}

            请按以下格式输出:
            1. 🟢 优点
            2. 🔴 问题(按严重程度排序)
            3. 💡 改进建议
            4. 📊 总体评分(1-10)
          " --format json > review.json

      - name: Post Review Comment
        uses: actions/github-script@v7
        with:
          script: |
            const review = JSON.parse(require('fs').readFileSync('review.json', 'utf8'));
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: review.output.text
            });

6.2 GitLab CI 示例

yaml
# .gitlab-ci.yml
claude-review:
  image: node:20
  stage: review
  variables:
    ANTHROPIC_API_KEY: $ANTHROPIC_API_KEY
  script:
    - npm install -g @anthropic-ai/claude-code
    - |
      claude -p "审查本次 MR 的所有变更" \
        --format json \
        --timeout 180 \
        > review-result.json
    - |
      python3 -c "
      import json
      with open('review-result.json') as f:
        data = json.load(f)
      with open('review.md', 'w') as f:
        f.write(data['output']['text'])
      "
  artifacts:
    paths:
      - review.md
    reports:
      codequality: review-result.json

七、总结

打印模式(-p)是 Claude Code 自动化能力的核心入口。通过合理配置输出格式、超时控制、错误处理和重试机制,你可以将其无缝集成到任何自动化流水线中。

关键要点:

  • 使用 --format json 配合 jq 进行结构化数据处理
  • 始终设置 --timeout 避免无限等待
  • 在 CI 中使用环境变量注入 API Key
  • 利用管道实现多步骤自动化处理
  • 编写健壮的错误处理和重试逻辑

八、下篇预告

交互模式 TUI 深度指南 — 探索 Claude Code 的终端用户界面,学习 tmux 编排多轮对话、实时监控工具调用、快捷键全解、自定义主题和会话管理。适合日常开发中需要深度交互和上下文保持的场景。