Руководства
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-json | JSON, разделённый переводами строк, для потоковой передачи в реальном времени |
Эта команда возвращает краткое описание проекта в 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 | Большинство действий вместо вас проверяет классификатор |
dontAsk | Claude Code отклоняет каждый вызов, который иначе потребовал бы запроса; это полезно для жёстко ограниченных запусков CI. Действия, не требующие подтверждения в режиме Manual, по-прежнему выполняются, как и действия, покрытые вашими записями --allowedTools или правилами permissions.allow |
acceptEdits | Claude записывает файлы без запроса, а 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 |
Аутентификация не проходит с --bare | Bare не использует вход по вашей подписке и никогда не читает учётные данные 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.
Источники
- Claude Code: Run Claude Code programmatically (
-p, форматы вывода, разрешения,--bare, возобновление сессий) - Claude Code: CLI reference (все флаги и опции CLI)
- Claude Code: Permission modes (что делает каждое значение
--permission-mode)