Files
llm-wiki/raw/errors/global-sed-env-rename-pitfalls-2026-06-06.md

2.9 KiB

title, source_type, status, related_branches, related_projects, tags, created, status_label
title source_type status related_branches related_projects tags created status_label
error / global-sed-env-rename-pitfalls-2026-06-06 error-note raw
feature-env-driven-runtime-configuration
ca-skeleton
error
ca-skeleton
shell
zsh
sed
refactoring
env
2026-06-06 resolved

error: global-sed-env-rename-pitfalls-2026-06-06

Layer: raw/errors/ — env 변수 일괄 rename(DB_*/LOG_*/… → APP_*) 중 sed 자동화에서 발생한 두 가지 silent 오류.

Parent / 부모

증상 / Symptom

오류 1 — zsh unquoted 변수 무분할로 sed no-op (silent)

sed: can't read src/.env src/app-bootstrap/.../application.yml: No such file or directory
  • 컨텍스트: FILES="a b"; for f in $FILES; do sed -i ... "$f"; done 형태로 두 파일에 동일 치환을 적용하려 함.
  • 원인: zsh 는 bash 와 달리 unquoted 파라미터를 기본적으로 word-split 하지 않는다. $FILES"a b" 단일 토큰으로 $f 에 들어가 sed"a b" 라는 하나의 경로를 찾다 실패.
  • 결과: 치환이 전혀 적용되지 않았는데 후속 grep sanity 체크에서 "구 토큰 잔존"으로 다행히 발각. 만약 sanity 체크가 없었다면 "rename 완료"로 오인할 뻔함.

오류 2 — blanket substring 치환이 Spring-native 키 훼손

spring.main.log-startup-info: ${SPRING_MAIN_LOG_STARTUP_INFO}  →(잘못)→  ${SPRING_MAIN_APP_LOG_STARTUP_INFO}
  • 컨텍스트: s/LOG_/APP_LOG_/gLOG_* env 그룹을 APP_LOG_* 로 일괄 변경.
  • 원인: SPRING_MAIN_LOG_STARTUP_INFO 는 유지해야 할 Spring-native 키인데 그 안에 부분문자열 LOG_ 가 들어 있어 함께 치환됨.
  • 결과: native 키가 존재하지 않는 이름으로 바뀌어 startup 시 placeholder 미해소 위험.

해결 / Resolution

  • 오류 1: 파일별로 절대경로를 명시한 함수 호출로 분리(apply <abs-path>), zsh word-split 의존 제거.
  • 오류 2: 치환 직후 grep -nE 'SPRING_[A-Z_]*APP_' 로 collateral 훼손을 탐지 → 역치환 s/SPRING_MAIN_APP_LOG_STARTUP_INFO/SPRING_MAIN_LOG_STARTUP_INFO/g 로 복구. 이후 모든 그룹 sweep 뒤 leftover/double-prefix sanity grep 을 강제 단계로 둠.

교훈 / Lesson

  • 일괄 rename 은 치환 직후 sanity grep(잔존 구토큰 0 + double-prefix 0 + native 키 무손상)을 같은 명령에 묶어라. 치환 성공을 가정하지 말 것.
  • substring 기반 group prefix 치환은 "유지 대상 키가 그 substring 을 포함하는가"를 먼저 점검. 포함 시 word-boundary(perl -pe '(?<!APP_)\bLOG_') 또는 명시적 제외가 필요.
  • shell 이식성: 다중 파일 루프는 zsh/bash 차이를 피하려 절대경로 + 명시 인자 사용.