클로드 코드로 자동화 만들기 #11

zsh bad math expression, for 루프에 넣은 숫자 쌍이 안 쪼개졌다

클로드 코드로 자동화 만들기12편 중 11번째

zsh에서 for 루프로 "270 330" 같은 숫자 쌍을 돌리다 bad math expression이 나면 set -- $r이 쌍을 둘로 나누지 못한 것이다. 쌍을 버리고 값 하나짜리 루프로 고쳐 돌렸다.

맥 기본 셸 zsh에서 for r in "270 330" "395 470"; do set -- $r 같은 루프를 돌리면 bad math expression: operator expected가 난다. zsh는 따옴표 없는 $r도 단어로 쪼개지 않아서 $1에 270 330이 통째로 들어가고, 산술식이 연산자 없이 숫자 두 개를 만난다. 쌍을 버리고 for s in 120 220 330 540처럼 값 하나짜리 루프로 고쳐 돌렸다.

회사를 그만두고 혼자 쇼츠 채널 몇 개를 굴리면서 영상 손질까지 클로드 코드(Claude Code)에 맡기고 있다. 쇼츠 한 편의 구성 파일을 쓰는 세션은 먼저 원본 영상(src.mkv)에서 장면 후보 구간을 ffmpeg로 잘라 보는데, 이 단계가 하루에 세 번 같은 모양으로 무너졌다.

같은 루프가 세 번, 에러는 세 가지

세 세션 모두 시작 초와 길이를 따옴표 쌍으로 묶어 루프에 넣었다. 점심때 세션은 "120 100", 오후 세션은 "270 330", 밤 세션은 "186 30"으로 시작했다. 돌아온 에러는 이랬다.

Error parsing options for output file src.mkv.
Exit code 1 (eval):1: bad math expression: operator expected at `330'
Error parsing options for input file src.mkv.

둘은 ffmpeg가 옵션을 못 읽었다는 말이고, 하나는 셸 산술이 깨졌다는 말이다.

bash -c로 감싼 우회는 승인 요구에 막혔다

오후 세션은 셸을 의심했다. 같은 루프를 bash -c '...'로 감싸 다시 돌렸는데 이번에는 클로드 코드가 실행 전에 멈췄다. 메시지는 “This command passes a shell -c script that runs rm, and Claude Code could not check the script for dangerous removals. Approve only if you have read the script.“였다. 스크립트 안에 rm이 들어 있었고, -c로 넘긴 문자열 안은 클로드 코드가 검사하지 못해서 사람 승인을 기다리는 쪽으로 간 것이다.

진짜 원인은 zsh가 $r을 쪼개지 않는 것

근거는 산술 에러 끝에 찍힌 330 하나다. 산술식이 270 330을 한 덩어리로 받았다는 뜻이고, set -- $r이 두 값을 $1·$2로 나누지 못했다는 뜻이다. 셸 산술이 아니라 ffmpeg로 바로 넘긴 다른 두 세션은 값이 에러에 안 찍혀서 같은 원인인지 직접 확인하지 못했는데, 두 세션 모두 바로 다음 명령에서 쌍을 버리고 값 하나짜리 루프로 고쳐 돌렸다(-ss $s -t 100처럼 길이는 고정).

다음

맥에서 AI에게 셸 루프를 맡긴다면, 루프 변수 하나에 값 두 개를 담는 모양이 보이는 순간 값 하나짜리 루프로 바꾸게 하세요. 오후 세션은 결국 루프를 버리고 -ss 270 -t 60 명령 하나로 장면을 잘랐다. 세 세션 모두 구성 파일을 쓰기 전에 교훈 파일(vault/72-cc/lessons.md)을 읽었지만 이 함정은 막지 못했다.

← 전체 글