CoreCodeБлог

Руководства

claude -p: как запускать Claude Code без интерактивного режима в скриптах и CI

Опубликовано · Проверено

Эта страница показывает, как вызывать Claude Code из скрипта через claude -p: базовое использование, передача ввода через pipe, три формата вывода, разрешения на инструменты, возобновление разговора и режим bare, с командами, которые можно скопировать. Флаги, поля и поведение взяты из документации Anthropic Run Claude Code programmatically, проверено 30 октября 2026 г. Это выборка; в документе больше, например сообщения subagents и фоновая работа.

Главное
  • Передайте -p (или --print) вместе с prompt, чтобы запустить без интерактивного режима. Claude Code завершается с кодом 0 при успехе и с ненулевым кодом при сбое, так что скрипт может ветвиться по нему.
  • --output-format принимает text (по умолчанию), json или stream-json. Добавьте --json-schema, чтобы получить поле structured_output.
  • В запуске claude -p в режиме Manual вызов инструмента, требующий подтверждения, отклоняется, если его ничто не подтверждает. Перечислите инструменты через --allowedTools или задайте базовый уровень через --permission-mode.
  • Anthropic рекомендует --bare для скриптовых вызовов и вызовов SDK: он пропускает автообнаружение hooks, skills, плагинов, серверов MCP, auto memory и CLAUDE.md, так что результат одинаков на любой машине.

Что делает -p

Добавьте флаг -p (или --print) к любой команде claude, чтобы запустить её без интерактивного режима. Так выполняется один prompt и печатается ответ:

claude -p "What does the auth module do?"

Не каждая опция CLI сочетается с -p. Claude Code отклоняет --bg, а также --cloud с описанием задачи, выдавая ошибку с названием конфликта.

Claude Code завершается с кодом 0 при успехе и с ненулевым кодом при сбое. Если передан недопустимый флаг, ошибка выводится в stderr до начала запуска. Когда сбой происходит внутри запуска, например отсутствует аутентификация, он печатается как результат в stdout.

Можно комбинировать -p с другими флагами. Этот заранее одобряет три инструмента, чтобы Claude мог работать без запроса:

claude -p "Find and fix the bug in auth.py" --allowedTools "Read,Edit,Bash"

Передача ввода через pipe

Неинтерактивный режим читает stdin, так что данные можно подать через pipe, а ответ перенаправить, как у любого другого инструмента командной строки. Здесь лог сборки подаётся на вход, а объяснение записывается в файл:

cat build-error.txt | claude -p 'concisely explain the root cause of this build error' > output.txt

Размер stdin через pipe ограничен 10 МБ. При превышении Claude Code завершается с понятной ошибкой и ненулевым статусом. Для больших входных данных запишите содержимое в файл и сошлитесь на путь к нему в prompt. Если Claude Code не может прочитать stdin, например потому, что запустивший его процесс закрыл свой конец, он выводит предупреждение в stderr и продолжает с prompt из командной строки.

Вызов также можно обернуть в скрипт и использовать Claude как линтер для конкретного проекта. Этот скрипт package.json подаёт в Claude diff относительно main и просит сообщить об опечатках. Благодаря pipe Claude не нужно разрешение Bash, чтобы прочитать diff, а экранированные двойные кавычки делают скрипт переносимым на Windows:

{
  "scripts": {
    "lint:claude": "git diff main | claude -p \"you are a typo linter. for each typo in this diff, report filename:line on one line and the issue on the next. return nothing else.\""
  }
}

Запустите его командой npm run lint:claude.

Форматы вывода

Используйте --output-format, чтобы управлять тем, как возвращаются ответы:

ЗначениеЧто вы получаете
text (по умолчанию)Простой текст
jsonСтруктурированный JSON с результатом, ID сессии и метаданными
stream-jsonJSON, разделённый переводами строк, для потоковой передачи в реальном времени

Эта команда возвращает краткое описание проекта в JSON, а текстовый результат лежит в поле result:

claude -p "Summarize this project" --output-format json

При --output-format json ответ также содержит total_cost_usd и разбивку стоимости по моделям, так что скрипт может отслеживать расходы. Если вы продолжаете предыдущий разговор через --continue или --resume, запуск сообщает общий итог всего разговора, включая расходы прежних запусков. Обе цифры — оценки на стороне клиента и могут отличаться от вашего фактического счёта.

Используйте такой инструмент, как jq, чтобы извлекать отдельные поля:

# Extract the text result
claude -p "Summarize this project" --output-format json | jq -r '.result'

# Extract structured output
claude -p "Extract function names from auth.py" \
  --output-format json \
  --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}' \
  | jq '.structured_output'

Структурированный вывод по JSON Schema

Чтобы получить вывод, соответствующий определённой схеме, используйте --output-format json с --json-schema и определением JSON Schema. Ответ содержит метаданные запроса (ID сессии, использование и т. д.), а структурированный вывод лежит в поле structured_output. Эта команда извлекает имена функций и возвращает их как массив строк:

claude -p "Extract the main function names from auth.py" \
  --output-format json \
  --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'

Если значение не является допустимой JSON Schema, claude завершается с Error: --json-schema is not a valid JSON Schema, за которым следует диагностика валидатора. Claude Code принимает схемы с ключевым словом format, например "format": "email", но считает format аннотацией и не проверяет его. Если запуск завершился без допустимого структурированного вывода, например потому, что Claude отклонил запрос, в ответе нет поля structured_output, поэтому проверяйте наличие поля, прежде чем использовать его в скрипте.

Потоковый вывод

Используйте --output-format stream-json вместе с --verbose и --include-partial-messages, чтобы получать токены по мере генерации. Каждая строка — объект JSON, представляющий событие:

claude -p "Explain recursion" --output-format stream-json --verbose --include-partial-messages

Последняя строка потока — сообщение result с итоговым текстом ответа, стоимостью и метаданными сессии. Этот фильтр jq оставляет только текстовые дельты; -r выводит сырые строки (без кавычек), а -j склеивает без переводов строк, чтобы токены выводились непрерывно:

claude -p "Write a poem" --output-format stream-json --verbose --include-partial-messages | \
  jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'

Событие system/init сообщает метаданные сессии, включая модель, инструменты, серверы MCP и загруженные плагины. Когда запрос к API завершается повторяемой ошибкой, Claude Code перед повтором выдаёт событие system/api_retry; его поля включают attempt, max_retries, retry_delay_ms и error_status. При stream-json отказы появляются как системные сообщения permission_denied, а итоговое сообщение result перечисляет их в permission_denials.

Разрешения на инструменты в неинтерактивном режиме

За клавиатурой никого нет, чтобы ответить на запрос, поэтому заранее решите, что Claude разрешено. Используйте --allowedTools, чтобы позволить Claude использовать некоторые инструменты без запроса. Если перечислить Read и Edit, Claude сможет читать и править файлы, не спрашивая разрешения, за исключением чтения по сетевым путям. Перечисление Bash делает то же для команд оболочки, кроме запуска, начатого в режиме auto: там Claude Code отбрасывает голую запись Bash как слишком широкое правило allow, а режим auto оценивает каждую команду отдельно. Эта команда запускает набор тестов и исправляет сбои с этими тремя перечисленными инструментами:

claude -p "Run the test suite and fix any failures" \
  --allowedTools "Bash,Read,Edit"

Вызовы инструментов, которых вы не перечислили, выполняются, если не требуют подтверждения. В запуске claude -p в режиме Manual вызов, требующий подтверждения, отклоняется, если его ничто не подтверждает, например hook PermissionRequest или --permission-prompt-tool. В Claude Code v2.1.302 и новее запуски claude -p стартуют в режиме Manual, если ничто не задаёт режим разрешений.

Чтобы ограничить инструмент конкретными командами, --allowedTools использует синтаксис правил разрешений. Завершающий * включает сопоставление по префиксу, так что Bash(git diff *) разрешает любую команду, начинающуюся с git diff. Пробел перед * важен: без него Bash(git diff*) совпадал бы и с git diff-index.

claude -p "Look at my staged changes and create an appropriate commit" \
  --allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"

Чтобы задать базовый уровень для всей сессии, а не перечислять отдельные инструменты, передайте режим разрешений через --permission-mode:

РежимПоведение в запуске -p
autoБольшинство действий вместо вас проверяет классификатор
dontAskClaude Code отклоняет каждый вызов, который иначе потребовал бы запроса; это полезно для жёстко ограниченных запусков CI. Действия, не требующие подтверждения в режиме Manual, по-прежнему выполняются, как и действия, покрытые вашими записями --allowedTools или правилами permissions.allow
acceptEditsClaude записывает файлы без запроса, а Claude Code автоматически одобряет типовые команды файловой системы, такие как mkdir, touch, mv и cp. Другие команды оболочки и сетевые запросы по-прежнему требуют записи --allowedTools или правила permissions.allow
claude -p "Apply the lint fixes" --permission-mode acceptEdits

Для заданий без присмотра передайте --permission-prompts none, когда некому отвечать на запросы разрешений, например в задании по расписанию. Всё, что потребовало бы запроса, отклоняется, если только hook PermissionRequest не разрешит это; Claude сообщают, что подтвердить запрос некому и повторять его не нужно, и запуск продолжается. Флаг требует Claude Code v2.1.259 или новее; более ранние версии отклоняют его ошибкой неизвестной опции.

claude -p "Update the dependency pins and run the tests" --permission-mode auto --permission-prompts none

Сами режимы объяснены в статье режимы разрешений Claude Code.

Продолжение разговора

Используйте --continue, чтобы продолжить самый последний разговор, или --resume с ID сессии, чтобы продолжить конкретный. Здесь выполняется проверка, а затем отправляются уточняющие prompts:

# First request
claude -p "Review this codebase for performance issues"

# Continue the most recent conversation
claude -p "Now focus on the database queries" --continue
claude -p "Generate a summary of all issues found" --continue

Если вы ведёте несколько разговоров, сохраните ID сессии, чтобы возобновить конкретный:

session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')
claude -p "Continue that review" --resume "$session_id"

Две команды можно запускать из разных каталогов: Claude Code находит сессию по её ID в любом проекте на этой машине. Вместо ID сессии можно передать --resume абсолютный путь к файлу транскрипта сессии .jsonl, и Claude Code продолжит разговор, сохранённый в этом файле.

Режим bare для скриптов и CI

Добавьте --bare, чтобы сократить время запуска, пропустив автообнаружение hooks, skills, пользовательских команд, subagents, установленных плагинов, серверов MCP, auto memory и CLAUDE.md. Без него claude -p обнаруживает и загружает их, как интерактивная сессия, включая всё настроенное в рабочем каталоге или в ~/.claude. Режим bare полезен для CI и скриптов, где нужен одинаковый результат на каждой машине: hook в ~/.claude коллеги или сервер MCP в .mcp.json проекта не запустятся, потому что bare их никогда не читает.

Задайте ANTHROPIC_API_KEY перед запуском, поскольку bare не использует вход по вашей подписке. Команда заранее одобряет инструмент Read, чтобы вызов завершился без запроса разрешения:

claude --bare -p "Summarize README.md" --allowedTools "Read"

В режиме bare Claude Code никогда не читает учётные данные OAuth и системную связку ключей. Для Anthropic API задайте ANTHROPIC_API_KEY в окружении, с ключом, созданным в Claude Console, или передайте apiKeyHelper в JSON --settings. Amazon Bedrock, Google Cloud's Agent Platform и Microsoft Foundry по-прежнему читают собственные учётные данные провайдера как обычно.

В режиме bare у Claude есть инструменты Bash, чтения файлов и правки файлов. Любой нужный контекст передавайте флагом:

Что загрузитьЧем
Дополнения к системному промпту--append-system-prompt, --append-system-prompt-file
Настройки--settings <file-or-json>
Серверы MCP--mcp-config <file-or-json>
Пользовательские агенты--agents <file-or-json>
Плагин--plugin-dir <path>, --plugin-url <url>

Без --bare сессия -p выполняет hooks из .claude/settings.json проекта и подключает серверы из его .mcp.json, даже в папке, которой вы никогда не доверяли. Сессия -p не показывает диалог доверия рабочему пространству и запрос одобрения для каждого сервера. Помните об этом, прежде чем запускать claude -p в репозитории, который писали не вы. В документе сказано, что --bare — рекомендуемый режим для скриптовых вызовов и вызовов SDK и в одном из будущих релизов станет режимом по умолчанию для -p.

Другие рецепты

Используйте --append-system-prompt, чтобы добавить инструкции, сохранив поведение Claude Code по умолчанию. Здесь diff PR подаётся в Claude с просьбой провести проверку безопасности. Сохраните это как shell-скрипт, например review.sh, и запустите bash review.sh 123; оболочка подставит 123 вместо "$1":

gh pr diff "$1" | claude -p \
  --append-system-prompt "You are a security engineer. Review for vulnerabilities." \
  --output-format json

--system-prompt полностью заменяет prompt по умолчанию. Если вы его заменяете, запуск также стартует без снимка статуса git.

Поддержка команд в режиме -p отличается. Skills и пользовательские команды, вызываемые пользователем, работают: включите /skill-name в строку prompt, и Claude Code раскроет его перед запуском. Встроенные команды, работающие только в интерфейсе терминала, например /login, недоступны. Чтобы изменить настройку, передайте key=value в /config, например /config thinking=false. Об интерактивных командах см. команды Claude Code. О запуске claude -p в workflows GitHub см. Claude Code с GitHub Actions.

Устранение неполадок

СимптомЧто говорится в документе
Недопустимый флагClaude Code сообщает об ошибке в stderr до начала запуска
Отсутствует аутентификацияЭто сбой внутри запуска, поэтому Claude Code печатает его как результат в stdout
Аутентификация не проходит с --bareBare не использует вход по вашей подписке и никогда не читает учётные данные OAuth и системную связку ключей. Задайте ANTHROPIC_API_KEY или передайте apiKeyHelper в JSON --settings
Ошибка с названием конфликта--bg отклоняется вместе с -p, как и --cloud с описанием задачи
Вызов инструмента отклонёнВ запуске в режиме Manual вызов, требующий подтверждения, отклоняется, если его ничто не подтверждает. Добавьте его в --allowedTools или задайте --permission-mode
Ошибка неизвестной опции для --permission-promptsФлаг требует Claude Code v2.1.259 или новее
Error: --json-schema is not a valid JSON SchemaПереданное значение не является допустимой JSON Schema; диагностика валидатора следует за сообщением
Нет поля structured_outputЗапуск завершился без допустимого структурированного вывода, например потому, что Claude отклонил запрос. Сначала проверьте наличие поля
Передача очень большого файла через pipe не работаетРазмер stdin через pipe ограничен 10 МБ. Запишите содержимое в файл и укажите путь в prompt
Настроенного сервера MCP нетClaude Code пропускает записи --mcp-config, не прошедшие проверку, и запуск завершается штатно. Проверьте mcp_server_errors в событии system/init; ключ опускается, когда ошибок нет, так что шлюз CI может падать на непустом массиве
Запуск остаётся открытым после того, как Claude закончилОн может ждать фоновую работу, запущенную Claude. По умолчанию Claude Code останавливает всё ещё выполняющееся после 10 минут непрерывного пассивного ожидания. Задайте CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS, чтобы изменить предел, или 0, чтобы ждать без предела
Код выхода 143Вы остановили запуск сигналом SIGTERM. Claude Code оставляет незавершённый ход как есть и не записывает для него результат. Чтобы вместо этого завершить ход, отправьте SIGINT, прежде чем останавливать процесс. Чтобы при возобновлении продолжить прерванный ход, задайте CLAUDE_CODE_RESUME_INTERRUPTED_TURN=1

FAQ

-p — это то же самое, что --print?

Да. В документе флаг описан как -p (или --print), и он превращает любую команду claude в неинтерактивный запуск.

Почему в скрипте отклонили мою правку или команду?

В запуске -p некому ответить на запрос разрешения. В режиме Manual вызов, требующий подтверждения, отклоняется, если его ничто не подтверждает, например hook PermissionRequest или --permission-prompt-tool. Перечислите нужные инструменты через --allowedTools, например --allowedTools "Bash,Read,Edit", или передайте --permission-mode acceptEdits для правок файлов.

Как получить одинаковый результат на каждой машине или раннере CI?

Добавьте --bare. Он пропускает hooks, skills, плагины, серверы MCP, auto memory и CLAUDE.md хоста, так что ~/.claude коллеги или .mcp.json проекта не повлияют на запуск. Сначала задайте ANTHROPIC_API_KEY, поскольку bare не использует вход по вашей подписке, и передайте нужный контекст флагами вроде --settings или --mcp-config.

Источники