ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쉘스크립트의 셔뱅 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

    정리하면 다음과 같다:

    1. 스크립트를 실행할 때 인터프리터를 호출하는 방식은 항상 셔뱅보다 우선한다.
    2. 스크립트가 실행 가능하지 않고 인터프리터로 실행되는 경우엔 셔뱅이 필요 없다.
    3. 스크립트가 실행 가능한 상태로 직접 실행되는 경우엔, 어떤 인터프리터를 사용할지 명시한 셔뱅이 필요하다.

    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
Designed by Tistory.