티스토리 뷰
문제가 발생하는 스크립트가 있어서 함수를 들여다 보았다. 문제는 다음과 같았다.
common.profile: line 53: typeset: -A: invalid option
typeset: usage: typeset [-afFirtx] [-p] name[=value] ...
common.profile: line 61: syntax error: operand expected
macOS에서는 bash를 버리고 zsh로 넘어갔고, bash는 version 3에 멈추어 있으며, typeset 은 변수 타입을 선언하는데 사용된다. 이때, -A 는 연관배열을 지시하는 zsh의 지시자인데, bash에는 없는 인자이다. zsh인데 다른 곳에서 문제가 생겨 bash로 넘어가면서 발생한 문제는 이렇다.
uniq_path는 PATH 에 들어간 경로중 특정 경로를 제거하고, 중복이 발견되면 또한 이것도 제거하기 위해 사용하는 함수인데, PATH를 NEWPATH라는 변수에 하나씩 복사하면서 특정 경로나 중복이 발견되면 복사하지 않는 방식으로 구현되어 있다. 여기서 중복은 연관배열의 키로 확인하는 방식으로 구현되어 있었다. 이것을 고전적인 일반배열로 바꾸고 싶었다.
코드를 직접 바꾸기 보다 claude에게 시키고 싶었는데, 일부러 지시를 할 때, "일반배열로 다시 구현하라"는 명령을 내리지 않았고, 그냥 수정을 하라는 정도로 지시했다. 그랬더니 다음과 같이 NEWPATH에 ":<path>:"라는 패턴이 발견되면 스킵하는 방식으로 고치더라.
배열을 사용하여 바꿀 것이라고 막연히 기대했으나, 조립되는 새 변수에 특정 패턴이 발견되는지 여부로 정말 보다 더 bourne shell 스럽게 고전적으로 처리했다. 아침에 소소한 감탄을 하게 되어 남긴다.

테스트까지 완료.
⏺ 변경 사항을 bash 3 (/bin/bash - macOS 기본값은 3.2)로 테스트합니다.
⏺ Bash(/bin/bash --version | head -1)
⎿ GNU bash, version 3.2.57(1)-release (arm64-apple-darwin25)
⏺ Bash(/bin/bash -c '
uniq_path() {…)'
⎿ Before: /usr/bin:/usr/local/bin:/usr/bin:/home/user/bin:/usr/local/bin
After uniq: /usr/bin:/usr/local/bin:/home/user/bin
After del /usr/local/bin: /usr/bin:/home/user/bin
⏺ bash 3.2에서 정상 동작합니다.
변경 내용 요약:
- typeset -A checks + ${checks[$p]} (연관 배열) → case ":$NEWPATH:" in *":$p:"*) 패턴 매칭으로 교체
- removing="$1" → local removing="$1" (전역 변수 누출 수정)
- local NEWPATH 초기화를 local NEWPATH=""로 명시
case 패턴 매칭으로 이미 NEWPATH에 포함된 경로인지 확인하는 방식이라 bash 2.x 이상, zsh, sh 어디서도 동작합니다.반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 덴드롱
- VIM
- macosx
- writely
- 식물
- 커피
- perl
- TCP/IP
- 구근
- Tattertools plugin
- tattertools
- SVN
- 벤자민
- MySQL
- 클레로덴드럼
- nodejs
- 킹벤자민
- 수선화
- ssh
- BlogAPI
- SSO
- Subversion
- JavaScript
- 디버깅
- OpenID
- 대화
- url
- 퀴즈
- 오픈소스
- Linux
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
글 보관함