콘텐츠로 건너뛰기

[AI 코딩] 클로드 코드 되돌리기, 종료 코드 0인데 백업이 빠졌다

돌고 있는 셸 스크립트에서 설명 줄 28바이트를 지웠을 뿐인데 백업 단계가 빠지고 원본 지우기가 실행됐고, 종료 코드는 0이었습니다(2026-10-01, macOS 27.0, bash 5.3.20 재현). 이럴 때 클로드 코드 되돌리기로 파일을 돌려도 이미 실행된 단계는 돌아오지 않습니다.

안녕하세요? 정리하는 개발자 워니즈입니다. 앞 글 클로드 코드 멀티 에이전트, 거짓 6건 뒤 나눈 역할에 이어, 9월 26일 실제로 겪은 스크립트 덮어쓰기와 빈 폴더에서 다시 돌린 실험 네 개를 정리합니다.

  • 무엇을 했나 클로드 코드 되돌리기(/rewind)는 파일 내용을 돌려놓는 기능이고, 저는 돌고 있는 bash 스크립트를 실행 중에 고치는 실험 A~D 를 돌렸습니다
  • 결과 숫자 28바이트 삭제는 종료 코드 0으로 백업을 건너뛰었고, 22바이트 추가는 종료 코드 2로 멈췄으며, 사본에 고쳐 mv 로 바꾸자 세 단계가 모두 돌았습니다
  • 누구에게 쓸모 크론처럼 주기적으로 도는 셸 스크립트를 AI 에게 고치게 하는 분께 맞습니다
고치는 방법 돌던 실행에 닿나 클로드 코드 되돌리기 기록 결과
셸 명령으로 제자리 편집(>, python open(w)) 닿음(같은 inode) 기록하지 않음 백업 건너뜀(0) 또는 문법 오류(2)
Edit 도구, sed -i, perl -pi 안 닿음(새 inode) Edit 도구만 기록 돌던 실행은 옛 판본 그대로
사본에 고치고 bash -n 뒤 mv 안 닿음(새 inode) 해당 없음 세 단계 모두 실행, 다음 실행부터 새 판본

1. 클로드 코드 되돌리기 전에, 왜 종료 코드 0이었나요?

bash 가 스크립트를 한꺼번에 읽지 않고 실행하면서 다음 위치를 바이트로 기억해 이어 읽는 것처럼 움직였기 때문입니다. 빈 폴더의 여섯 줄짜리 deploy.sh(준비, 백업, 원본 지우기를 echo 로만 찍는 모형)를 돌려 두고 1초 뒤 맨 위 설명 줄을 지우자 출력이 [1] 준비 다음 [3] 원본 지우기 로 끝났습니다. 오류는 한 줄도 없었습니다. 결과가 가장 나쁜 경우가 신호는 가장 조용했습니다.
클로드 코드 되돌리기 실험 A의 repro.log 실제 출력, 준비 다음 백업 만들기 없이 원본 지우기가 찍히고 종료 코드는 0
정직하게 덧붙이면, 지운 줄을 다음 백업 줄과 같은 28바이트로 일부러 맞췄습니다. 길이가 어긋난 실험 B(문구 22바이트 추가)는 한글 글자 한가운데부터 읽혀 종료 코드 2로 멈췄습니다. 흔한 쪽은 B 이고, A 는 운이 나쁘면 오류 없이 엉뚱한 단계가 돈다는 데까지만 보여 줍니다.
66번째 바이트 위치 대비, 실험 A는 28바이트가 줄어 원본 지우기 줄이 오고 실험 B는 22바이트가 늘어 한글 글자 한가운데가 되는 것을 보여주는 다이어그램

2. 어떤 고치기가 같은 inode 에 다시 쓰나요?

> 리다이렉트와 python open(w) 가 같은 inode 에 다시 쓰고, sed -i '', perl -pi, 사본 뒤 mv, Claude Code 2.1.281 Edit 도구는 새 inode 를 만들었습니다(ls -i 실측, 표는 부록). 돌던 bash 를 깨는 것은 같은 inode 쪽입니다. Edit 도구 결과는 한 버전에서 한 번 본 값이라 일반화하지 않습니다.
고치기 방법 7가지의 inode 번호 변화, 리다이렉트와 python open(w)만 같은 inode를 유지하고 나머지는 새 inode로 바뀌는 것을 보여주는 타임라인
9월 26일 실제 사고도 이 차이로 막았습니다. lsof -p PID 로 돌던 프로세스가 옛 inode 를 쥔 것을 보고, 백업을 cat 백업 > 원본 으로 같은 inode 에 되돌린 뒤 새 판본은 mv 로 넣었습니다. 권한을 줄 때 되돌릴 수 있다고 믿는 비용은 AI 에이전트 권한 설계와 되돌리기 비용에 적었습니다.

3. 클로드 코드 되돌리기(/rewind)는 어디까지 되돌리나요?

Claude 의 파일 편집 도구로 고친 파일까지입니다. 공식 문서는 체크포인트가 “Checkpointing does not track files modified by Bash commands.” 라고 적고, 버전 관리를 대신하지 않는다고 못 박습니다(Claude Code checkpointing 공식 문서). 가장 위험한 셸 명령 편집이 가장 되돌리기 어려운 편집이기도 했습니다.
클로드 코드 되돌리기(/rewind) 메뉴 항목 정리, 공식 문서 기준 Restore code and conversation, Restore conversation, Restore code, Summarize from here, Summarize up to here, Never mind와 Bash로 바뀐 파일은 추적하지 않는다는 문장
원본 지우기는 파일이 아니라 이미 일어난 행동이라 /rewind 로 파일을 돌려도 지워진 것은 그대로입니다. 그래서 되돌리기를 믿을 만하게 만드는 대신 고치는 순서를 바꿨습니다.

4. 사본에 고치고 bash -n 뒤 mv 로 바꾸면 무엇이 달라지나요?

실험 A 와 똑같이 설명 줄을 지우되 사본 deploy.sh.new 에서 고치고 bash -n 통과 뒤 mv 로 넣자, inode 가 6015892 에서 6015932 로 바뀌었고 돌던 프로세스는 옛 판본의 세 단계를 종료 코드 0으로 끝까지 실행했습니다. 편집 내용은 같고 원본에 닿는 방식만 바꿨는데 백업이 살아 있었습니다.
원본을 그대로 두고 사본에 고친 뒤 bash -n이 통과하면 mv로 바꿔 넣고, 돌던 프로세스는 옛 판본을 끝까지 읽는 5단계 흐름

상황 하는 일
주기적으로 도는 셸 스크립트를 고친다 사본에 고치고 bash -n 통과 뒤 mv
시각만 바꿔 한 번 돌려 본다 원본은 그대로, 사본을 돌림
이미 실행 중에 덮어썼다 lsof -p PID, cat 백업 > 원본, 새 판본은 mv
파이썬 스크립트 규칙 대상에서 뺌(실행 중 고치기 실험은 안 함, 미확인)

상황별로 고르는 복구 방법, 주기적으로 도는 셸 스크립트는 사본+bash -n+mv, 한 번만 돌려볼 때는 사본 실행, 파이썬 스크립트는 규칙 대상 아님, 이미 실행 중 덮어썼다면 lsof+백업 복구를 보여주는 카드

5. 이렇게 해도 안 되는 것은 무엇인가요?

  1. 이미 실행된 단계는 어떤 되돌리기로도 돌아오지 않아, 지워질 대상은 git 이나 별도 백업으로 지킵니다
  2. bash -n 은 문법만 보고 단계 순서를 잘못 바꾼 판본은 통과시킵니다
  3. 9월 25일 여러 번 제자리 편집하고도 무사했던 이유, /rewind 가 같은 inode 에 쓰는지, zsh 나 다른 bash 판의 동작은 확인하지 않았습니다
  4. 세 줄은 작업 규칙이지 게이트가 아닙니다. 규칙과 지켜짐이 다른 이야기라는 것은 AI에게 규칙을 알려줬는데 안 지켜졌습니다에서 겪었습니다

필자의 결론

클로드 코드 되돌리기는 파일을 돌리는 도구이고, 돌고 있는 스크립트의 사고를 막는 도구는 아닙니다.

주기적으로 도는 셸 스크립트는 사본에 고치고 bash -n 통과 뒤 mv 로 바꾸세요.

오늘은 그런 스크립트 하나에 ls -i 를 찍어 두고, 다음에 고친 뒤 번호가 바뀌었는지만 확인해 보세요.

돌고 있는 스크립트를 고칠 때 다른 방식으로 막고 계신 분은 어떤 순서를 쓰시나요?

부록: 재현 명령과 출력

  1. 환경. 2026-10-01 밤, macOS 27.0, GNU bash, 버전 5.3.20(1)-release (aarch64-apple-darwin27.0.0), mktemp -d 로 만든 /tmp 빈 폴더. deploy.sh 는 1 #!/bin/bash, 2 # 옛 설명(공백으로 28바이트), 3 echo "[1] 준비", 4 sleep 3, 5 echo "[2] 백업 만들기", 6 echo "[3] 원본 지우기".
  2. 실험 A 명령과 출력.
bash deploy.sh > a.out 2>&1 & P=$!; sleep 1
python3 -c "p='deploy.sh'; s=open(p).read(); open(p,'w').write(s.replace(s.splitlines(True)[1],''))"
wait $P; echo "종료 코드 $?"; cat a.out
== 실험 A: 실행 중에 맨 위 설명 줄 하나를 지운다(제자리 편집)
종료 코드 0
[1] 준비
[3] 원본 지우기
  1. 실험 B 출력(3번 줄을 echo "[1] 준비 (설명을 늘렸다)" 로 늘림).
종료 코드 2
[1] 준비
deploy.sh: 줄 5: 예기치 않은 `)' 토큰 주변에서 문법 오류
deploy.sh: 줄 5: `� 늘렸다)"'
  1. 66번째 바이트 계산. 줄 길이는 12, 28, 18, 8, 28, 28바이트라 백업 줄은 66번째 바이트에서 시작합니다. 28바이트를 지우면 그 자리에 원본 지우기 줄이 오고, 22바이트를 넣으면 그 자리가 을 의 세 번째 바이트입니다(repro.sh 문자열을 python3 -c 로 셈).
  2. inode 실측(repro-inode.log, ls -i).
고치기 방법 inode 번호 앞 단계와 비교
처음 만든 파일 6020480 기준
sed -i '' 6020481 새 inode
perl -pi 6020482 새 inode
> 리다이렉트 6020482 같은 inode
python open(w) 6020482 같은 inode
사본 만들고 mv 6020484 새 inode
Claude Code 2.1.281 Edit 도구 6020314 에서 6020348 로 새 inode(대화형으로 따로 확인)
  1. 실험 C 명령과 결과.
cp deploy.sh deploy.sh.new
# 여기서 deploy.sh.new 를 고친다
bash -n deploy.sh.new && echo "bash -n 통과" && mv deploy.sh.new deploy.sh; ls -i deploy.sh

바꾸기 전 6015892, bash -n 통과, 바꾼 뒤 6015932, 돌던 프로세스 종료 코드 0, 돌던 프로세스와 다음 실행 모두 [1] 준비, [2] 백업 만들기, [3] 원본 지우기.

  1. 실제 사고 기록. 2026-09-25 다른 세션이 같은 스크립트를 여러 번 제자리 편집(로그에 문법 오류 없음, 이유는 미확인), 2026-09-26 AI 세션 하나가 실행 중인 스크립트를 덮어씀(inode 복구로 피해를 막음). 셀프테스트가 통과해도 실데이터에서 틀렸던 비슷한 결의 기록은 바이브 코딩 현실, 테스트는 통과했는데 261편 중 6편만 맞았다에 있습니다.

이 글을 쓴 사람

인프라와 DevOps를 실무로 다루면서 겪은 것을 기록합니다. Docker, Kubernetes, AWS, 그리고 AI 도구를 실제로 써 보고 남기는 로그입니다.

Threads·X

새 글이 올라오면 Threads @wonizz.ai 에도 올립니다. 팔로우해 두면 피드에서 바로 볼 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다