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

56 lines
2.9 KiB
Markdown

---
title: error / global-sed-env-rename-pitfalls-2026-06-06
source_type: error-note
status: raw
related_branches: [feature-env-driven-runtime-configuration]
related_projects: [ca-skeleton]
tags: [error, ca-skeleton, shell, zsh, sed, refactoring, env]
created: 2026-06-06
status_label: resolved
---
# error: global-sed-env-rename-pitfalls-2026-06-06
> Layer: `raw/errors/` — env 변수 일괄 rename(`DB_*`/`LOG_*`/… → `APP_*`) 중 `sed` 자동화에서 발생한 두 가지 silent 오류.
## Parent / 부모
- [[raw/branch-notes/feature-env-driven-runtime-configuration]]
## 증상 / Symptom
### 오류 1 — zsh unquoted 변수 무분할로 sed no-op (silent)
```text
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 키 훼손
```text
spring.main.log-startup-info: ${SPRING_MAIN_LOG_STARTUP_INFO} →(잘못)→ ${SPRING_MAIN_APP_LOG_STARTUP_INFO}
```
- 컨텍스트: `s/LOG_/APP_LOG_/g``LOG_*` 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 차이를 피하려 절대경로 + 명시 인자 사용.
## 관련 / Related
- [[raw/branch-notes/feature-env-driven-runtime-configuration]] (M1 env rename)