본문 바로가기
Linux

Shebang (#!)

by Sondho 2021. 2. 25.

Shebang 이란?

  • Sharp(#)' + 'Bang(!)의 합성어
  • #!은 2Byte의 매직넘버(magic number)로 Unix계열 OS(리눅스, Mac)에서 스크립트(bash, python등등) 코드 최상단에서 해당 파일을 해석해 줄 인터프리터의 절대경로를 지정
  • 스크립트를 실행할 때 (예 : ./script명령 줄에서) Linux는 스크립트를 실행하는 데 사용되는 프로그램을 파악하기 위해 shebang 줄이라는 특수 줄을 사용합니다.
    예)
    #!/bin/bash ⇒ Bash 스크립트
    #!/usr/bin/env python3 ⇒ Python 스크립트용.
  • shebang 줄이 없으면 기본적으로 Bash에서 스크립트를 실행. (즉, 쉘 스크립트로)
  • 셸 스크립트가 아니라 파이썬 스크립트일 경우 #!/bin/bash로 명시가 되있다면 Bash에서 Python 코드를 셸 스크립트로 해석하려고하여 많은 오류가 발생합니다.

구성

#!interpreter [optional-arg]
  • '#!' 바로 뒤에 interpreter 경로가 온다. ⇒ 절대 경로
    그 뒤에는 인터프리터를 위한 인자들이 온다. ⇒ 선택 사항
  • 매직 바이트가 #문자로 시작하는 이유는 많은 인터프리터 언어에서 #문자가 주석으로 사용되기 때문에 실제 스크립트 편집에서 주석처럼 무시되기 때문

예시

 #!/bin/bash
 #!/usr/bin/python
 #!/usr/bin/perl
 #!/usr/bin/php

env

  • 시스템에 따라 인터프리트 경로가 달라질 수 있기 때문에 사용하는 방법
    (예를 들어 /bin/python/usr/bin/python)

  • #!/usr/bin/env + 언어의 형태로 입력

       #!/usr/bin/env bash
       #!/usr/bin/env python
       #!/usr/bin/env perl
       #!/usr/bin/env php

Shebang을 안썼을 때 오류가 나는 케이스

  • 파이썬 스크립트 파일을 실행하려고 할 때 python test.py로 실행하면 별 다를게 없이 실행이 잘 된다

      # test.py
      user = input("What's your name?\n=> ");
      print(f"Hello {user}. Welcome!");
    
      ##
      # 실행 결과
      # $ python test.py
      # ./test.py: 1: Syntax error: "(" unexpected
      ##
  • 하지만 chmod +x test.py를 주고 ./test.py의 형식으로 실행을 할 경우, 실행이 되지 않는다.

```
  # test.py
  user = input("What's your name?\n=> ");
  print(f"Hello {user}. Welcome!");

  ##
  # 실행 결과
  # $ chmod +x test.py
  # $ ./test.py
  # ./test.py: 1: Syntax error: "(" unexpected
  ##
```
  • 이 경우에 #!/usr/bin/env python을 써주게 되면 제대로 실행 된다.

      # test.py
      #!/usr/bin/env python
    
      user = input("What's your name?\n=> ");
      print(f"Hello {user}. Welcome!");
    
      ##
      # 실행 결과
      # $ chmod +x test.py
      # $ ./test.py
      # What's your name?
      # => Sondho
      # Hello Sondho, Welcome!
      ##

댓글