비대화 모드(-p)로 스크립트에서 실행하기

비대화 모드는 -p 옵션으로 프롬프트를 넘겨 결과만 받고 종료하는 Claude Code 실행 방식입니다. 출력 형식, 도구 허용, 커스텀 커맨드 호출, 파이프 연동, 세션 이어 가기까지 자동화에 필요한 옵션을 공식 문서 기준으로 정리합니다.

10분 갱신

매일 새벽 회의록을 정리하거나 커밋 전에 오타를 검사하는 일에 사람이 터미널 앞에 앉아 있을 필요는 없습니다. claude -p는 프롬프트를 넘기고 결과만 받아 종료하는 비대화 모드이며, 스크립트·크론·CI에서 Claude Code를 부르는 진입점입니다. 이 코스의 마지막 글로, 우리 초급 과정 7주차의 "반복 업무 무인화"가 바로 이 모드 위에서 돌아갑니다.

핵심 요약

  • claude -p "프롬프트"는 응답을 출력하고 종료합니다. 모든 CLI 옵션이 -p와 함께 동작합니다.
  • 출력 형식은 text(기본), json, stream-json 세 가지이며 --json-schema로 구조를 강제할 수 있습니다.
  • 권한 프롬프트를 받아 줄 사람이 없으므로 --allowedTools나 --permission-mode로 미리 허용 범위를 정합니다.
  • stdin으로 데이터를 파이프할 수 있고(10MB 제한), --continue·--resume으로 이전 실행을 이어 갑니다.
  • 각 호출은 독립 세션이며 토큰은 대화 모드와 똑같이 소비됩니다.

대화 모드와 무엇이 다른가

대화 모드는 사람이 매 턴 개입하는 루프이고, 비대화 모드는 사람 없이 한 번 돌고 끝나는 루프입니다. 그래서 권한 확인이 나오면 답할 사람이 없어 멈추므로 허용 범위를 미리 정해야 하고, /login처럼 대화창을 여는 명령은 쓸 수 없으며, 결과를 프로그램이 파싱하므로 출력 형식이 중요합니다. 공식 문서는 이 모드를 Agent SDK의 CLI 형태로 설명하며 같은 루프를 Python과 TypeScript 패키지로도 제공합니다.

기본 사용법은 어떻게 되나

claude -p "이 프로젝트의 접수 API가 하는 일을 요약해 줘"

-p는 --print의 축약입니다. 기본으로는 대화형 세션과 같은 컨텍스트(CLAUDE.md, 훅, 스킬, MCP, 자동 메모리)를 로드합니다. 머신마다 같은 결과가 필요한 CI에서는 --bare를 붙여 자동 검색을 건너뛰고 필요한 것만 --settings, --mcp-config 같은 플래그로 넘깁니다. 공식 문서는 --bare를 스크립트의 권장 모드로 안내하며 향후 -p의 기본값이 될 예정이라고 밝힙니다. --bare는 키체인을 읽지 않으므로 인증은 ANTHROPIC_API_KEY나 --settings의 apiKeyHelper로 넘깁니다.

모델 지정 · --model

claude -p "이 diff를 한 줄로 요약해 줘" --model haiku

별칭 sonnet, opus, haiku, fable 또는 전체 모델명을 씁니다. 우리 6주차의 모델 나눠 쓰기를 자동화에 옮기면 요약·분류 배치는 haiku나 sonnet, 코드 수정은 opus입니다. --effort low로 추론 강도를 낮추는 것도 배치 비용을 줄입니다.

확인 없이 쓸 도구 지정 · --allowedTools

claude -p "테스트를 실행하고 실패를 고쳐 줘" \
  --allowedTools "Bash(pnpm test *),Read,Edit"

권한 규칙 구문을 그대로 씁니다. Bash(git diff *)처럼 공백과 *를 붙이면 접두 일치이고, 공백이 없으면 git diff-index까지 잡히므로 주의합니다. 반대로 --disallowedTools "WebSearch"로 도구를 빼거나 --tools "Read,Grep"로 내장 도구 자체를 제한합니다. 우리 7주차의 "운영 DB는 성역"은 --disallowedTools "Bash(psql *)" 같은 거부 규칙으로 구현됩니다.

출력 형식은 어떻게 고르나

형식 내용 용도
text 응답 본문만 사람이 읽거나 파일로 저장
json result, session_id, total_cost_usd, 모델별 사용량 등 프로그램에서 파싱
stream-json 이벤트별 줄 단위 JSON 실시간 표시, 진행 상황 추적
claude -p "이 프로젝트를 요약해 줘" --output-format json | jq -r '.result'

특정 구조가 필요하면 --json-schema를 함께 씁니다. 결과는 structured_output 필드에 들어가며, 스키마가 잘못되면 Error: --json-schema is not a valid JSON Schema로 종료합니다.

claude -p "회의록에서 할 일을 뽑아 줘" --output-format json \
  --json-schema '{"type":"object","properties":{"todos":{"type":"array","items":{"type":"string"}}},"required":["todos"]}' \
  | jq '.structured_output'

스트리밍은 --output-format stream-json --verbose --include-partial-messages이며 마지막 줄이 최종 결과와 비용을 담은 result 메시지입니다.

커스텀 커맨드를 스크립트에서 호출하려면

사용자가 만든 스킬과 커스텀 커맨드는 -p에서도 동작합니다. 프롬프트 문자열에 /스킬이름을 넣으면 실행 전에 확장됩니다(v2.1.205 이상).

claude -p "/meeting-notes ./recordings/2026-08-27.m4a"

우리 3주차 실습의 녹음 회의록 변환기를 스킬로 만들어 두면 이 한 줄이 새벽 크론 작업이 됩니다. /model, /effort처럼 값을 받는 내장 명령도 인수와 함께 쓸 수 있으며, 비대화 모드에서 바꾼 모델·설정은 그 세션에만 적용됩니다.

권한 확인을 전부 건너뛰기 · --dangerously-skip-permissions

claude -p "린트 수정을 적용해 줘" --dangerously-skip-permissions

--permission-mode bypassPermissions와 같습니다. 공식 문서는 인터넷이 차단된 컨테이너나 VM 같은 격리 환경에서만 쓰라고 경고하며 프롬프트 주입 보호가 없다고 명시합니다. root나 sudo로는 시작이 거부됩니다. 대안으로 --permission-mode acceptEdits는 파일 편집과 mkdir·mv 같은 파일 명령만 자동 승인하고, dontAsk는 permissions.allow에 없는 것을 모두 거부해 잠긴 CI에 맞습니다. 우리 권장 순서는 allow 규칙 → acceptEdits → dontAsk이며 bypass는 격리 환경에서만입니다.

파이프와 조합하면 무엇이 가능한가

비대화 모드는 stdin을 읽고 stdout으로 씁니다. 다른 유닉스 도구처럼 앞뒤에 붙일 수 있습니다.

# 빌드 오류 설명을 파일로
cat build-error.txt | claude -p '이 빌드 오류의 근본 원인만 간단히 설명해 줘' > output.txt

# 커밋 전 오타 검사
git diff main | claude -p "오타 검사기다. 오타마다 파일명:줄 한 줄, 문제 한 줄만 출력해라."

diff를 파이프로 넘기면 Claude가 읽기 위해 Bash 권한이 필요 없다는 점이 요령입니다. 파이프된 stdin은 10MB로 제한되므로 큰 입력은 파일로 쓰고 경로를 프롬프트에 적습니다.

그 밖에 알아 둘 옵션

  • --max-turns N: 에이전트 턴 수 상한. 기본은 제한 없음.
  • --max-budget-usd: API 지출 상한(인쇄 모드 전용).
  • --no-session-persistence: 이번 실행을 디스크에 남기지 않음.
  • --fallback-model sonnet,haiku: 기본 모델 과부하 시 순서대로 대체.

주의할 점은 무엇인가

각 호출은 독립된 세션이다

claude -p를 두 번 실행하면 두 번째는 첫 번째를 모릅니다. 이어 가려면 --continue(같은 디렉토리의 최근 세션) 또는 --resume <세션 ID>를 씁니다.

claude -p "성능 문제를 검토해 줘"
claude -p "이번엔 DB 쿼리에 집중해 줘" --continue

sid=$(claude -p "검토 시작" --output-format json | jq -r '.session_id')
claude -p "그 검토를 이어서" --resume "$sid"

--continue는 같은 폴더의 최근 세션을 찾으므로 같은 폴더에서 실행하고, --resume <세션 ID>는 v2.1.223부터 폴더와 무관하게 재개할 수 있습니다. -p로 만든 세션은 /resume 선택기에 나오지 않지만 ID로는 재개됩니다. 실행 중 띄운 백그라운드 셸은 결과 반환 약 5초 뒤 종료됩니다.

토큰은 똑같이 소비된다

비대화라고 싸지 않습니다. 대화 모드와 같은 컨텍스트를 로드하고 요금제 한도(5시간·주간 윈도우)도 똑같이 차감됩니다. 배치 작업은 --bare로 시작 컨텍스트를 줄이고, 가벼운 모델과 낮은 effort를 쓰며, JSON 출력의 total_cost_usd로 호출당 비용을 로그에 남깁니다. 자동 모드에서 분류기가 반복 차단하면 물어볼 사람이 없어 실행이 중단된다는 점도 기억합니다.

정리

  • claude -p는 결과만 받고 끝나는 루프이며 모든 CLI 옵션과 함께 씁니다.
  • 파싱은 --output-format json과 --json-schema, 권한은 --allowedTools·--permission-mode로 미리 정합니다.
  • 스킬은 프롬프트에 /이름으로 넣어 실행하고, 위험 명령은 거부 규칙으로 막습니다.
  • 파이프 입력은 10MB까지, 이어 가기는 --continue·--resume.
  • CI와 스크립트는 --bare가 권장이며 비용은 대화 모드와 같습니다.

자주 묻는 질문

비대화 모드에서 도구 확인 프롬프트 때문에 스크립트가 멈춥니다.

필요한 도구를 --allowedTools "Read,Edit,Bash(pnpm test *)"처럼 미리 허용하거나 --permission-mode acceptEdits를 줍니다. 잠긴 CI라면 dontAsk가 허용 목록 밖을 모두 거부해 멈추지 않습니다.

--allowedTools 에 없는 도구는 아예 못 쓰나요?

못 쓰는 것이 아니라 확인을 요구합니다. 확인할 사람이 없으니 사실상 실행되지 않습니다. 도구 자체를 빼려면 --tools나 --disallowedTools를 씁니다.

결과를 프로그램에서 파싱하려면 어떻게 하나요?

--output-format json으로 받고 jq -r '.result'로 본문을, .session_id로 세션 ID를, .total_cost_usd로 비용을 꺼냅니다. 정해진 구조가 필요하면 --json-schema를 추가해 .structured_output을 읽습니다.

이전 실행 결과를 이어서 작업할 수 있나요?

같은 폴더에서 --continue를 붙이면 최근 세션을, --resume <세션 ID>를 붙이면 특정 세션을 이어 갑니다. 세션 ID는 첫 실행의 JSON 출력에서 얻습니다.

커스텀 커맨드도 스크립트에서 실행되나요?

됩니다. 프롬프트 문자열에 /스킬이름 인수를 넣으면 실행 전에 확장됩니다. 대화창을 여는 /login 같은 명령만 예외이며, /model·/effort처럼 값을 받는 명령은 인수와 함께 씁니다.

비대화 모드claude -p--output-format--allowedTools자동화핵심 개념

팀에 클로드코드를 도입하려면 실제 업무에 맞춘 설계가 필요합니다. 무료 상담 신청 →