bash/zsh 호환 문제: 스크립트 작성 시 주의점

bash 로 작성한 스크립트를 zsh 로 돌리려고 하니 문제가 생겼다.
사실 이게 우분투/리눅스에선 큰 문제가 되지 않는다. 대부분 배포판엔 bash 가 설치되어 있으니, hashbang 만 정확하게 명시해주면 login shell 이 zsh 라도, 스크립트는 알아서 bash (또는 hashbang 에서 지정한 방식)로 돌아갈테니, 큰 문제가 되진 않는다.

사실 이 문제의 발단은 macOS bash 였다. macOS 는, 모종의 이유(?)로 인해, 현재 최신판인 Mojave 에도 무려 10년도 더 전의 bash 를 기본 탑재하고 있다. 저작권 문제인데, 정확한 이유는 모르겠으나, 아무튼 애플의 영업에는 도움이 되지 않는 사안인지, 구판을 그대로 제공하고 있다.

일반 사용자들에겐 아무런 문제가 될 게 없고, 강한(ㅎㅎ Power) 사용자들이야 알아서 할테니 그것도 큰 문제는 아니라고 보고, 나처럼 이도 저도 아닌 사람들만 짜증이 난다.

위 글은 Bash 최신판을 설치하는 법(Homebrew)과 설정하는 법을 다루고 있는데, 그걸 따라하다가, 어차피 Linux/macOS 모두 zshell 을 쓰기로 했다면, 차라리 zsh 에 맞게(또는 가능한한 범용으로) 스크립트를 고치는 편이 낫겠다는 생각을 했다.

그리하여.. 살짝 또 꽃삽질을 하게 됐다.


내 원래 스크립트에서 문제가 된 부분은 세가지였다.

  1. Regex Array 부분.
if ! [[ "$1" =~ $sony_player_regex ]]

이런 부분이 있었는데, Zsh 에선 오류가 발생했다. Regex Match 관련 문제였는데, 이 부분은 setopt BASH_REMATCH 로 해결할 수 있었다

2. IFS, 문자열을 배열로 변환.

Bash 에선, IFS 를 지정해주고 배열로 변환하면, 해당 IFS 를 사용하여 배열로 변환이 되었는데, 역시 Zsh 에선 문제가 있었다.
여기도 역시 setopt sh_word_split 가 필요했다.

IFS='|' files_from_DC_array=($files_from_DC)

3. 소문자 변환

소문자 변환을 다음과 같이 시행했었는데, echo "${ext,,}" 이게 Bash 4.0 이상부터 지원하는 기능이라고 한다. macOS 는 3 에 머물고 있으므로 이걸 쓸 수가 없다.
따라서, 전통방법으로 바꿨다.

extlower=$(echo "$ext" | awk '{print tolower($0)}')

awk 는 거의 아는 바가 없어서.. 뭐라 설명을 못하겠군.

일단은 이 정도..

Tags:, ,
One Comment

안녕하세요. 글 남겨주셔서 고맙습니다.