-
쉘스크립트의 셔뱅 shebang기타 2021. 3. 29. 10:10
1. 쉘 스크립트란?
쉘 스크립트는 쉘에서 사용할 수 있는 명령어들을 조합하여 만든 배치(batch) 파일이다. 우리가 흔히 알고 있는 Python, Perl, Ruby 같은 스크립트 언어는 각각 고유의 인터프리터를 가지고 있으며, 이 인터프리터는 따로 설치해야 한다.
하지만 쉘 스크립트는 조금 다른데, 운영체제의 쉘 자체에 인터프리터 기능이 내장되어 있기 때문에 별도로 설치할 필요 없이 쉘이 직접 스크립트를 실행해 준다. 즉, 쉘 스크립트는 운영체제와 밀접하게 연동되며, 우리가 사용하는 셸 환경(Bash, Zsh 등)에서 바로 실행할 수 있다.
스크립트 언어로 만들어졌기 때문에 결국은 인터프리터가 명령어를 한 줄씩 읽어가며 처리하지만, 쉘 스크립트의 경우 이 인터프리트 역할을 셸 자체가 담당한다.
2. 스크립트 실행 에러 경험
아래와 같이 test.sh라는 쉘 스크립트를 작성했다.
하지만 ./test.sh 로 실행하니 "bad interpreter: No such file or directory" 라는 오류가 발생한다.
#!/bin/bash 맨 위에 슬래시 하나 빠졌기 때문이였다.
그런데 bash test.sh로 실행했을 때는 정상 작동했다. 왜 이런 차이가 생겼는지 이해하고자 셔뱅(shebang)에 대해 더 깊이 알아보게 되었다.
askubuntu.com/questions/1158577/bin-bash-bad-interpreter-no-such-file-or-directory
3. 셔뱅(shebang)이란?
셔뱅은 스크립트 파일의 첫 줄에 위치하는 #!로 시작하는 문자열이며, 이 줄은 유닉스 계열 운영체제에서 매우 중요한 역할을 한다. 셔뱅은 해당 스크립트를 어떤 인터프리터로 실행할지를 시스템에 알려주는 역할을 한다.
예를 들어, 스크립트가 이렇게 작성되어 있다면: #!/bin/sh
리눅스/유닉스 시스템의 프로그램 로더(program loader)는 /bin/sh를 실행하고, 스크립트 파일 경로를 첫 번째 인수로 넘겨준다. 즉, 내부적으로는 다음과 같은 명령을 실행하는 셈이다: /bin/sh path/to/script
한 가지 주의할 점은, 셔뱅은 많은 스크립트 언어에서 주석처럼 보인다. # 문자는 대부분의 스크립트 언어에서 주석 기호로 사용되기 때문이다. 따라서 해당 언어의 인터프리터는 셔뱅을 무시할 수도 있다.
예를 들어, 스킴(Scheme)처럼 #이 주석 기호가 아닌 언어에서는 셔뱅을 따로 처리하지 않기도 한다.
일부 시스템에서는 전처리기(preprocessor)가 셔뱅 줄을 제거하거나 평가한 뒤 나머지 스크립트를 컴파일러나 인터프리터에 넘기기도 한다.
셔뱅(shebang)은 해시 기호와 느낌표(#!)로 이루어진 문자 시퀀스로, 스크립트의 맨 처음에 온다.
유닉스 계열 운영 체제에서 셔뱅이 있는 스크립트는 프로그램으로서 실행되며,
프로그램 로더가 스크립트의 첫 줄의 나머지 부분을 인터프리터 지시자(interpreter directive)로 구문 분석한다.
즉, 지정된 인터프리터 프로그램이 대신 실행되어 스크립트의 실행을 시도할 때 처음 사용되었던 경로를 인수로서 넘겨주게 된다.4. 셔뱅이 있을 수도, 없을 수도 있는 경우
스크립트를 어떻게 실행하느냐에 따라 셔뱅의 필요 여부가 달라진다.
- 인터프리터로 실행할 경우:이처럼 명시적으로 인터프리터를 호출할 경우에는 셔뱅이 없어도 실행된다.
bash test.sh
- 스크립트 자체를 실행할 경우:이처럼 직접 실행하려면 셔뱅이 반드시 필요하고, 지정된 경로의 인터프리터가 존재해야 하며, 스크립트에 실행 권한이 있어야 한다.
./test.sh
정리하면 다음과 같다:
- 스크립트를 실행할 때 인터프리터를 호출하는 방식은 항상 셔뱅보다 우선한다.
- 스크립트가 실행 가능하지 않고 인터프리터로 실행되는 경우엔 셔뱅이 필요 없다.
- 스크립트가 실행 가능한 상태로 직접 실행되는 경우엔, 어떤 인터프리터를 사용할지 명시한 셔뱅이 필요하다.
5. 실행 권한과 실행 오류
스크립트를 ./test.sh로 실행하려면 실행 권한이 있어야 한다. 그렇지 않으면 "permission denied" 오류가 발생한다.
chmod +x test.sh
6. 쉘 스크립트 실행 방법 요약
./test.sh 셔뱅에 정의된 인터프리터로 실행. 실행 권한 필요 (#!/bin/bash 는 bash 쉘로 sh 를 실행하겠다.) sh test.sh sh 인터프리터를 명시적으로 사용. 셔뱅 무시됨 (sh 는 리눅스, 유닉스에 기본적으로 있는 인터프리터) bash test.sh bash를 명시적으로 사용. 셔뱅 무시됨 (지정 인터프리터로 실행) 7. Git Bash 환경에서의 차이
작성자는 Git Bash 환경에서 작업 중이었다. 이 경우 sh 명령어가 제대로 작동하지 않는 경우가 있어, sh test.sh는 동작하지 않고, ./test.sh 또는 bash test.sh만 사용할 수 있었다.
나는 git bash 에서 작업해서 sh test.sh 는 되지 않고 1번과 3번만 사용 가능했다.
마무리
- 쉘 스크립트는 쉘에 내장된 인터프리터가 실행하는 스크립트이다.
- 셔뱅(#!)은 운영체제가 어떤 인터프리터로 스크립트를 실행할지 지정하는 중요한 장치다.
- 셔뱅 줄이 잘못되었거나 빠지면 ./script.sh 실행 시 오류가 발생한다.
- 실행 권한(chmod +x)과 줄바꿈 문자(LF vs CRLF)에도 유의해야 한다.
반응형'기타' 카테고리의 다른 글
레지스터와 메인 메모리의 차이와 역할 (0) 2022.09.03 리눅스 기초 훑기 (0) 2021.04.23 - 인터프리터로 실행할 경우:이처럼 명시적으로 인터프리터를 호출할 경우에는 셔뱅이 없어도 실행된다.