Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

리눅스 셸 스크립트의 '#!'(shebang)란 무엇일까?

#!은 흔히 shebang(쉬뱅), shabang, hashbang, poundbang 등으로 불립니다. 이 글에서는 'shebang'이라는 명칭으로 통일하겠습니다.

수많은 리눅스 셸 스크립트 맨 앞에서 볼 수 있는 #! — 대체 무엇일까요? 지금부터 하나씩 자세히 살펴보겠습니다.

보통 다음과 같은 형태입니다

#!/bin/bash

#!은 파일의 시작 부분, 즉 보통 첫 번째 줄에 위치하며, 바로 뒤에 실행 파일의 경로가 따라옵니다(위 예시에서는 bash 셸).

주석(comment)입니다

#로 시작하기 때문에 스크립트 코드의 일부로 실행되지는 않습니다. 하지만 스크립트의 동작 방식에는 영향을 미치는데, 그 이유는 바로…

인터프리터 지시문이 뒤따르기 때문입니다

shebang은 인터프리터 실행 파일의 경로를 시스템에 알려줌으로써, 해당 스크립트를 어떤 인터프리터로 실행할지 지정하는 역할을 합니다.

  • 올바른 인터프리터가 파일 전체를 처리할 수 있도록, 보통 파일의 첫 번째 줄에 배치합니다.
  • 지정하는 경로는 반드시 적절한 실행 파일의 절대 경로(absolute path)여야 합니다.
  • shebang 줄에는 인터프리터에 전달할 옵션을 포함할 수 있지만, 환경에 따라 지원 여부가 다릅니다. 안전하게 사용하려면 옵션은 하나만 포함하는 것이 좋습니다.

활용 예시

아래는 대표적인 #! 사용 예시와 각각의 의미입니다.

bash

#!/bin/bash

스크립트 맨 앞에 이 줄을 넣으면, 시스템은 이 스크립트를 bash 셸 실행 파일로 실행합니다.

zsh

#!/bin/zsh

마찬가지로 스크립트 맨 앞에 이 줄을 넣으면, zsh 셸 실행 파일로 실행됩니다. bash와 zsh의 차이점이 궁금하다면 관련 비교 글도 함께 참고해 보세요!

Python

#!/usr/bin/env python3

스크립트를 Python 3로 실행합니다. 여기서 눈여겨볼 점은 python3 실행 파일의 경로를 직접 지정하는 대신, /usr/bin/env를 통해 현재 사용자 환경에 설정된 python3를 찾아 사용한다는 것입니다. 이렇게 하면 파이썬 설치 경로가 달라져도 스크립트가 잘 동작합니다.

아무것도 실행하지 않기!

#!/bin/false

실패(failure) 상태 코드를 반환하고 스크립트를 실행하지 않습니다. 직접 실행할 목적이 없는 스크립트에서 사용됩니다.

#! 우회하여 실행하기

다음과 같이 #!이 포함된 스크립트를 실행하는 경우를 생각해 봅시다.

./myscript.sh

여기서 myscript.sh는 스크립트 이름이며, 어떤 인터프리터를 사용할지는 shebang을 통해 결정됩니다. 단, 이 방식은 현재 사용자에게 해당 스크립트의 실행(execute) 권한이 있을 때만 가능합니다.

반면, 다음과 같이 실행하면 어떻게 될까요?

bash myscript.sh

이 경우 호출 명령 자체에 bash를 지정했기 때문에, shebang 줄은 인터프리터 선택에 사용되지 않습니다. 실제로 실행되는 것은 스크립트가 아니라 bash이므로, 스크립트에 대한 읽기(read) 권한만 있으면 충분합니다.