CS/Linux

#!/bin/bash vs #!/usr/bin/env bash

dragonhyeon 2024. 9. 22. 12:29
728x90
반응형

#!

#! 은 # (sharp, hash) 과 ! (bang) 이 합쳐진 문자열로 셔뱅 (shebang) , 혹은 해쉬뱅 (hashbang) 이라고 읽습니다.

 

유닉스 및 유닉스 계열 운영체제에서는 셔뱅이 스크립트 파일의 맨 처음에 위치할 경우 해당 줄을 셔뱅 라인 (shebang line) 으로 인식합니다. 셔뱅 라인은 커널에게 해당 스크립트 파일을 실행할 때 어떤 인터프리터 (ex. /bin/bash, /usr/bin/python3) 를 사용해야 하는지 알려주는 역할을 합니다. 셔뱅 뒤에 인터프리터의 실행 경로를 표기합니다.

#!/bin/bash

셔뱅 라인 동작 원리

  1. 사용자는 터미널에 ./sample.sh 와 같이 명령을 입력합니다.
  2. 셸은 명령 (./sample.sh) 을 해석하여 커널에 작업 처리를 요청합니다.
  3. 커널은 스크립트 파일을 실행하며 그 과정에서 스크립트 파일의 첫 줄을 읽어 셔뱅 라인을 확인합니다.
    • 셔뱅 라인이 존재할 경우 커널은 셔뱅 뒤에 명시된 명령어 (보통 인터프리터) 를 실행하고 해당 스크립트 파일을 인자로 넘겨줍니다.
    • 셔뱅 라인이 존재하지 않을 경우 커널은 시스템의 기본 셸을 실행하고 해당 스크립트 파일을 인자로 넘겨줍니다.
셔뱅 라인에는 꼭 인터프리터의 경로만 올 필요는 없으며, 다른 명령어도 올 수 있습니다. (ex. #!/usr/bin/cat) 하지만 보통은 인터프리터의 경로가 오는 것이 일반적입니다.
인터프리터가 스크립트 파일을 실행할 때 해당 스크립트 파일의 셔뱅 라인은 맨 앞의 # 로 인해 주석으로 인식됩니다. 실행되는 프로그램에 따라서는 스크립트 파일을 실행할 때 셔뱅 라인을 주석으로 처리하지 않는 경우도 있습니다.

#!/bin/bash vs #!/usr/bin/env bash

커널은 셔뱅 라인의 명령어를 실행할 때 셸처럼 $PATH 환경 변수를 사용하지 않습니다. 따라서 셔뱅 라인에는 실행 파일의 절대 경로를 명시해야 합니다. (ex. #!bash 와 같이 단순히 bash 라고만 적으면 커널은 해당 명령어를 찾지 못하여 오류를 반환합니다.)

  • #!/bin/bash: 특정 경로에 있는 인터프리터를 명확하게 지정하므로, 해당 경로에 bash 가 존재하고 동일한 버전을 사용할 때 일관된 실행 환경을 제공합니다.
  • #!/usr/bin/env bash: env 는 $PATH 환경 변수를 사용하여 지정된 명령어를 찾아 실행합니다. 즉, 특정 시스템에서 bash 가 /bin/bash 에 있지 않는 경우에도 bash 를 찾아 실행할 수 있어 스크립트의 이식성이 높아집니다.
728x90
반응형

'CS > Linux' 카테고리의 다른 글

권한 시스템과 chmod  (3) 2024.09.27
source ~/.bashrc 설명  (3) 2024.09.26
useradd, userdel, usermod 등 명령어 설명  (4) 2024.09.21
Linux 사용자 계정, sudo, su, su - 설명  (5) 2024.09.21
APT 설명  (6) 2024.09.09