shell script에서 #!를 뭐라고 부를까?

이번에 Docker 관련 공부하면서 몇시간 동안 삽질하면서 시간을 낭비했는데 Shell Script의 첫라인에 #! 관련 라인을 넣지 않아서 발생하는 문제였습니다.

Bourne shell (sh)과 Bourne Again shell (bash)의 "==", "=" 에 대한 미묘한 차이 때문에 발생하는 문제였습니다. 예를 들어 if 절에 문자열 비교 시 bash에서는 "==", "=" 모두 사용 가능하지만 sh에서는 "=" 만 가능합니다. Keepalived 를 설정에 있어 track_script에 지정한 script 내에 if 비교에 다음과 같이 작성했는데 shell에서 테스트를 수행하면 정상적으로 동작 하는 것이 Keepalived 에서 동작하면 무조건 else 절로 빠져 버리는 현상이 있었습니다. 이것때문에 몇시간 삽질을 했는데 결론은 바로 이 Shebang 때문이었습니다.

1
2
3
4
5
6
RUNNING=$(/usr/bin/docker inspect --format="{{ .State.Running }}" $CONTAINER 2> /dev/null)
if [ "$RUNNING" == "true" ]; then
  exit 0
else 
  exit 1
fi

Keepalived는 track_script에 지정된 명령을 child process로 실행하는데 이때의 shell 환경은 Bourne shell이 었습니다. 따라서 위 프로그램은 "==" 에서 무조건 에러가 발생하여 else 절이 수행되었던 것입니다.

문제 해결 방법은 위 스크립트 파일의 첫번째 줄에 다음 라인을 추가해서 이 스크립트를 bash로 실행하라고 알려주면 됩니다.

#!/bin/bash

삽질한 김에 이렇게 붙이는 것을 무엇이라고 부르는지 찾아 보았는데 Shebang라고 하네요. 위키피디아는 https://en.wikipedia.org/wiki/Shebang_(Unix) 에 정의되어 있는데 sharp(#) + bang(!) 합성어로 sha-bang 이라 한다고 하는데 맞는지는 모르겠습니다.

결론은 shell script 만들때에는 반드시 이 shebang는 넣어주는 것을 잊지 말아야 한다는 것입니다.


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.