#!

She (#) bang (!) 또는 shabang, hashbang 라인은 스크립트 파일의 첫줄에 사용하여 스크립트가 어떤 명령에 의해 실행될지를 지정합니다. 프로그램의 경로는 절대경로나 현재 디렉토리로부터 상대경로를 사용할 수 있으며 변수는 사용할 수 없습니다. 그리고 shebang 라인에서 사용할 수 있는 옵션은 하나로 제한됩니다.

#! /bin/bash               # bash 스크립트 실행을 위한 shebang line
...
#! /bin/sed -f             # sed 스크립트 실행을 위한 shebang line
...
#! /usr/bin/awk -f         # awk 스크립트 실행을 위한 shebang line
...
#! /usr/bin/perl -T        # perl 스크립트 실행을 위한 shebang line
...

#! 문자는 텍스트 파일을 바이너리 실행파일처럼 실행할 수 있게 해주는 역할을 합니다. OS 가 실행 퍼미션이 설정된 파일을 실행할 때 처음에 #! 문자를 만나면 뒤에 이어지는 나머지 라인을 해당 파일을 실행하기 위한 인터프리터로 취급합니다. 그러므로 가령 foo 라는 이름의 파일이 있고 첫줄이 #!/bin/sed -f 로 시작한다면 프롬프트 상에서 foo arg1 arg2 arg3 명령을 실행할 경우 실제로는 /bin/sed -f foo arg1 arg2 arg3 와 같이 실행되게 됩니다.

다음은 #!/bin/bash -x shebang 라인을 갖는 bash 스크립트를 실행했을 때 ps 입니다.

#! /bin/more shebang 라인을 가지므로 실행시 /bin/more hello 와 같이 실행되어 자신의 텍스트 내용을 프린트합니다.

$ cat hello
#! /bin/more
hello 
shebang
line

$ chmod +x hello

$ ./hello
#! /bin/more
hello 
shebang
line

shebang 라인 무시하기

다음과 같이 직접 bash 명령을 이용해 실행하면 shebang 라인이 무시되고 bash -m -f 에 의해 스크립트 파일이 실행됩니다. ( shebang 라인은 bash 에의해 주석으로 처리되겠죠 )

$ bash -m -f script.sh

Portability

간혹 #!/usr/bin/env 를 사용하는 shebang 라인을 본적이 있으실 겁니다. 이와 같이 사용하는 이유는 OS 별로 프로그램의 위치가 다를 수 있기 때문인데요. 가령 python 프로그램은 /usr/bin/python 에 위치할 수도 있고 /usr/local/bin/python 에 위치할 수도 있습니다. 이럴경우 특정 OS 에서는 shebang 라인을 수정해서 사용해야 합니다. 하지만 #!/usr/bin/env python 와 같이 사용하면 $PATH 를 검색해서 python 프로그램을 실행하게 되므로 문제를 해결할 수 있습니다. 이 방법의 단점은 python 에 옵션을 사용할 수 없다는 것입니다.

스크립트 파일에는 set uid 를 설정할 수 없습니다.

프로그램을 root 권한으로 실행하게 만들수 있는 set uid 설정을 shell script 에 적용할 경우 보안과 관련해서 많은 문제가 생길 수 있다고 합니다. 그리고 shell script 은 기본적으로 명령들을 다루기 때문에 어떤 명령이 보안과 관련해서 버그가 있을 경우 바로 문제로 이어질 수 있습니다.

shebang line 을 쓰지 않아도 될 때

스크립트 파일을 직접 명령으로 실행시킬 때 외에는 shebang line 을 쓰지 않아도 됩니다. source 명령으로 읽어들이는 스크립트들, ~/.bashrc , ~/.profile 같은 환경설정 파일들, 명령 자동완성 함수를 작성할 때 등등 ...