Codex CLI 비대화형 실행: 스크립트에서 작업 맡기고 검증하는 법
대화창 없이 스크립트에서 Codex CLI에 파일 수정을 맡기려면 codex exec에 작업 폴더와 -s workspace-write를 지정하고, 신뢰된 폴더나 Git 저장소가 아니면 --skip-git-repo-check를 더해야 한다.
이 결과는 설치와 인증을 마친 macOS arm64의 codex-cli 0.161.0에서, 대상이 수정 가능한 로컬 파일일 때 성립한다. 공식 문서와 로컬 실행은 모두 2026-11-03에 확인했다.
codex exec의 종료 코드 0은 수정 성공이나 테스트 통과를 보증하지 않는다. diff와 테스트 종료 코드로 따로 검증해야 한다.
Codex CLI 비대화형 실행은 왜 한 줄로 끝나지 않을까
OpenAI Codex 공식 문서는 codex exec를 TUI를 열지 않는 스크립트용 실행으로 설명한다. 그런데 이 실행에는 폴더 신뢰 검사와 읽기 전용 기본값이 걸려 있다.
그래서 폴더 지정, 검사 통과, 쓰기 허용, 실행 후 검증을 따로 다뤄야 한다.
세 번 실행해서 확인한 것
재현용으로 Git 저장소가 아닌 새 폴더에 파일 두 개를 만들었다. calculator.py는 고의로 뺄셈을 반환한다.
def add(a: int, b: int) -> int:
return a - b
test_add.py는 두 수의 합을 검사한다.
from calculator import add
# Given two positive integers, when adding, then return their sum.
assert add(2, 3) == 5
print("PASS: add(2, 3) == 5")
처음 상태에서 /usr/bin/python3 -B test_add.py는 AssertionError, 종료 코드 1로 실패했다.
첫 번째 실험은 비 Git 폴더에서 아무 옵션 없이 실행했다.
/opt/homebrew/bin/codex exec -C <폴더> "Fix calculator.py so test_add.py passes."
0.232초 만에 종료 코드 1로 거부됐다. stderr에는 아래 문구가 나왔다.
Reading additional input from stdin...
Not inside a trusted directory and --skip-git-repo-check was not specified.
두 번째 실험은 검사 예외를 주고 -s read-only로 수정을 요청했다.
/usr/bin/time -p /opt/homebrew/bin/codex exec --skip-git-repo-check -C <폴더> -s read-only "Fix calculator.py so test_add.py passes. … Report whether the edit was blocked."
40.59초 뒤 종료 코드 0으로 끝났지만, 로그에는 차단 문구가 남았다.
patch rejected: writing is blocked by read-only sandbox; rejected by user approval settings
파일은 a - b 그대로였다. 따로 돌린 테스트도 종료 코드 1로 실패했다.
세 번째 실험은 -s workspace-write에 결과 캡처 옵션 --json과 -o를 더했다.
/usr/bin/time -p /opt/homebrew/bin/codex exec --skip-git-repo-check -C <폴더> -s workspace-write --json -o <폴더>/last-message.txt "Fix only calculator.py so test_add.py passes. … Report the change and test result."
20.78초 뒤 종료 코드 0으로 끝났다. 따로 실행한 diff -u calculator.before.txt calculator.py에서 아래 변경을 확인했다.
def add(a: int, b: int) -> int:
- return a - b
+ return a + b
같은 테스트를 다시 돌리니 PASS: add(2, 3) == 5와 종료 코드 0이 나왔다.
| 실험 | 주요 옵션 | 종료 코드 | 파일 변경 | 독립 테스트 |
|---|---|---|---|---|
| 기본 실행 | -C <폴더> | 1 (0.232초) | 없음, 실행 전 거부 | 실행 안 함 |
| 읽기 전용 | --skip-git-repo-check -s read-only | 0 (40.59초) | 없음, 패치 차단 | 1 (AssertionError) |
| 쓰기 허용 | --skip-git-repo-check -s workspace-write --json -o | 0 (20.78초) | a + b로 변경 | 0 (PASS) |
거부, 차단, 거짓 성공이 나뉜 이유
왜 결과가 셋으로 나뉘었을까.
첫째, 작업 폴더 지정과 폴더 신뢰 검사는 다른 기능이다. -C, --cd <DIR>는 작업 루트를 정할 뿐이다.
OpenAI Codex 비대화형 모드 공식 문서는 기본적으로 Git 저장소 안에서 실행하도록 요구한다. 비 Git 폴더는 --skip-git-repo-check로 허용한다고 설명한다. 첫 번째 실험의 오류 문구도 trusted directory와 이 플래그를 함께 언급한다.
둘째, 검사 통과와 쓰기 권한은 별개다. 같은 문서는 codex exec의 기본 권한을 read-only로 설명하고, 수정 작업에는 --sandbox workspace-write를 쓰라고 안내한다. 이전의 --full-auto는 문서상 더 이상 지원되지 않고, 로컬 0.161.0 도움말에도 없다.
셋째, 이번 실행에서 종료 코드 0은 에이전트가 실행을 마쳤다는 뜻에 그쳤다고 본다. 두 번째 실험의 마지막 답변은 테스트를 실행했다고 주장했지만, 로그에는 패치 거부 뒤 테스트 명령 이벤트가 없었다.
그래서 자연어 답변이나 종료 코드만으로 수정 완료를 판정하면 안 된다.
그림처럼 폴더 검사, 쓰기 권한, 수정을 모두 지나도 성공 판정은 마지막 직접 확인에서만 한다.
스크립트에 넣을 때의 순서
-C <폴더>로 작업 루트를 지정한다. 신뢰된 디렉터리나 Git 저장소가 아니면--skip-git-repo-check를 더한다.- 파일을 고치는 작업이면
-s workspace-write로 읽기 전용 기본값을 바꾼다. - 마지막 답변은
-o <파일>로 저장하고, 단계별 이벤트가 필요하면--json으로 stdout의 JSON Lines를 받는다. codex exec가 끝나면 스크립트에서 따로diff와 테스트를 실행해 실제 변경과 테스트 종료 코드 0을 확인한다.
매번 같은 규칙을 전달해야 한다면 설정과 지침 파일을 쓴다. 기본 설정 공식 문서는 ~/.codex/config.toml과 신뢰한 프로젝트의 .codex/config.toml보다 명령행 플래그와 -c key=value가 우선한다고 설명한다.
AGENTS.md 공식 문서는 전역 지침과 프로젝트 루트부터 현재 폴더까지의 AGENTS.md를 기본 32 KiB 한도 안에서 합쳐 읽는다고 설명한다. 이 파일은 모델에 주는 규칙이고 OS 권한 경계와는 다르다.
결과 파일이 분명한 작업도 같은 방식으로 넘길 수 있다. 2026-10-28 블로그 이미지 제작 기록에는 아래 형태의 명령이 남아 있다. 같은 날 다른 원고 묶음의 기록에도 표지·장면·순서도 아이콘 9개 작업이 같은 방식으로 적혀 있다.
codex exec --skip-git-repo-check -C images/gen -s workspace-write "Call the built-in image_gen tool exactly once. Image: <프롬프트> Copy the PNG into the current directory as <파일>"
0.161.0의 내장 image_gen을 한 번 호출해 PNG를 지정 폴더에 저장하게 한 사례로 본다.
확인하지 못한 것
이번 결과는 macOS arm64 한 대, codex-cli 0.161.0, 파이썬 파일 한 건을 한 번씩 실행한 관찰이다.
세 번째 실험에서는 개인 전역 지침 때문에 기존 TDD 스킬을 읽는 동작이 있었다. 아무 설정이 없는 환경과는 결과가 다를 수 있다.
에이전트 승인 및 보안 공식 문서에 따르면 workspace-write는 네트워크가 기본 비활성이고 .git 같은 보호 경로가 있다. 그래도 임시 디렉터리 등이 쓰기 범위에 들어갈 수 있어, 폴더 하나만 완벽히 격리된다고 볼 수는 없다.
stdout과 stderr 분리, --output-schema, 파이프 입력, codex exec resume, codex sandbox는 문서와 도움말만 봤다. 요금제 한도, 토큰 비용, Linux·Windows·CI 인증 환경, 계정별 이미지 생성 지원도 검증하지 않았다.
지침 파일이 모델 행동에 주는 영향은 하네스 엔지니어링 측정 1편 — AGENTS.md 비우면 Codex도 fail-fast 안 지킨다에서 볼 수 있다. 자동 검증을 묶는 방법은 하네스 엔지니어링 — CLAUDE.md만 쓴다고 끝나지 않는다에서 이어진다.
결론
스크립트에서 Codex CLI로 파일 수정을 맡기려면 codex exec에 -C, 필요하면 --skip-git-repo-check, 그리고 -s workspace-write를 지정한다.
결국 성공 기준은 종료 코드 0이나 마지막 답변이 아니라 실행 직후의 diff와 독립 테스트 종료 코드다.
지금 스크립트에 codex exec를 넣는다면 -o로 답변을 남기고, 바로 다음 줄에 테스트와 종료 코드 검사를 추가해 보자.

댓글
댓글 쓰기