스크립트 파일의 시작 부분에 #! / bin / bash를 넣어야하는 이유는 무엇입니까?


486

나는 전에 Bash 스크립트를 만들었고 #!/bin/bash처음 에는 모두 잘 작동 했습니다.

그것을 넣는 요점이 무엇입니까? 상황이 다를까요?

또한 어떻게 발음 #합니까? 나는 그것이 !"bang"으로 발음 된다는 것을 안다 .

#!발음 은 어떻게 되나요?


8
선택의 여지가 없으면 필요하지 않으며해서는 안됩니다. (POSIX) 셸과 bash의 차이점에 대해 배우고 '#! / bin / sh'를 사용하십시오. 쉘이 다른 시스템에서 자신을 찾고 스크립트가 작동하기를 원할 때 이력서가 너무 커지기 하루 전이 될 것입니다.
Jens

50
"Hash-Bang"또는 "She-Bang"이라고 발음됩니다.
비치 하우스

22
스크립트를 실행 파일로 실행하는 경우에만 실행된다는 점에 주목할 가치가 있다고 생각합니다. 그런 다음 실행 플래그를 설정하고 경우에 따라서 입력 ./yourscript.extension, 예를 들어, ./helloworld.py또는 ./helloworld.sh그것이 될 것이라고 상단 라인에서 통역, 찾을 것이다, #!/bin/python또는 !#/bin/bash스크립트를 실행할 때와 같은 반면, python helloworld.py이 주석 때문에, 첫 번째 줄은 관찰되지 않습니다 밖. 따라서 쉘 / 커널의 특별한 순서입니다.
JFA

파이썬과 #에! #을 사용할 때 @JFA는 bash와 python 사이에서 순서가 변경됩니다! bash를 위해?
AAI

1
@AjeyaAnand 아니 잘못 잘못 잡은
JFA

답변:


426

* nix 쉘이 어떤 종류의 인터프리터를 실행할지 아는 규칙입니다.

예를 들어, 이전 버전의 ATT는 기본적으로 sh (Bourne 쉘)이고, 이전 버전의 BSD는 기본적으로 csh (C 쉘)입니다.

오늘날에도 (대부분의 시스템에서 bash, "Bourne Again Shell"을 실행하는 ) 스크립트는 bash, python, perl, ruby, PHP 등이 될 수 있습니다. 예를 들어, #!/bin/perl또는을 볼 수 있습니다 #!/bin/perl5.

PS : 느낌표 ( !)는 애정이 "bang"이라고 합니다. 쉘 주석 기호 ( #)를 때때로 "hash"라고 합니다.

PPS : * nix에서 파일 형식과 접미사를 연결하는 것은 "규칙" 이 아니라 규칙 일뿐 입니다. 실행 파일은 바이너리 프로그램뿐만 아니라 백만 스크립트 유형과 다른 것들 중 하나 일 수 있습니다. 따라서의 필요성 .#!/bin/bash


1
다른 유용한 정보, $ #를 발견했습니다. 그게 뭐야?
노드 닌자

91
shebang은 규칙 이 아니며 syscall을 처리 할 때 커널에 의해 해석됩니다 execve(2). 따라서 shebang은 쉘 컨벤션 이 아니라 커널 컨벤션입니다.
바 실레 Starynkevitch

10
또한 Vim과 같은 일부 편집자가 파일에 확장자가없는 경우 구문 강조를위한 언어를 결정하는 데 도움이됩니다. shebang이 없으면 Vim은 일반 텍스트 파일과 동일한 bash 스크립트를 표시합니다.
Aaron Blenkush

1
그것은 나를 추가 할 필요가 있는지 궁금합니다 #!/bin/sh같은 것들로 .profile실행이 그 물건 온로드
계산법 캐년에게

5
그래서 ... hash-bang-slash-bin-slash-bash ?
Bernat

134

shebang #!실행 파일 ( x mode ) 파일 의 처음 2 바이트 인 경우 shebang을 보다 정확하게하기 위해 execve (2) 시스템 호출 (프로그램 실행 )에 의해 해석됩니다 . 그러나 POSIX 사양execve 은 shebang을 언급하지 않습니다.

그 뒤에는 인터프리터 실행 파일의 파일 경로가 와야합니다 (BTW는 상대적 일 수도 있지만 대부분 절대적 임).

사용자의 인터프리터 (예 :)를 찾는 좋은 트릭 (또는 아마도 좋지 않은 방법python )은 다음과 $PATH같이 env프로그램 을 사용하는 것입니다 (항상 /usr/bin/env모든 Linux에서)

 #!/usr/bin/env python

모든 ELF 실행 파일은 인터프리터가 될 수 있습니다. 사용 #!/bin/cat하거나 #!/bin/true원할 수도 있습니다 ! (그러나 그것은 종종 쓸모가 없을 것입니다)


8
해킹 에 대한 토론은 이 질문 을 참조하십시오 #!/usr/bin/env.
키이스 톰슨

파이썬에 인수를 전달하려면 실제로 어떻게해야합니까 #!/usr/bin/env bash -x? 어떻게해야합니까?
indianwebdevil

그것의 간단한 나 자신이 그것을 발견, 그냥 그 후 매개 변수를 추가#!/usr/bin/env bash -x
indianwebdevil

bash거의 항상 /bin/bash당신의 shebang해야#!/bin/bash -x
Basile Starynkevitch

49

그것은 shebang 이라고합니다 . 유닉스-스피크에서, #는 샤프 (음악에서와 같이) 또는 해시 (트위터에서 해시 태그와 같은)라고하며! 뱅이라고합니다. 실제로 Bang-bang이라는 !!로 이전 쉘 명령을 참조 할 수 있습니다. 따라서 합치면 haSH-BANG 또는 shebang을 얻습니다.

# 다음 부분! 유닉스에게 어떤 프로그램을 실행시키는 지 알려준다. 지정하지 않으면 bash (또는 sh 또는 zsh 또는 $ SHELL 변수가 무엇이든)로 시도하지만 거기에 있으면 해당 프로그램을 사용합니다. 또한 #은 대부분의 언어에서 주석이므로 후속 실행에서 줄이 무시됩니다.


2
이미 bash에 있다면 #! / bin / bash가 표시되면 다른 bash 인스턴스를 시작합니까? 이미 bash에 있고 나가면 어떻게 되나요? 차이점이 있습니까?
노드 닌자

2
@javascriptninja은 새로운 bash 쉘을 시작합니다. bash의 경우 이미 bash를 사용하는 한 아무런 차이가 없습니다. shebang은 (a) python 또는 perl과 같은 쉘이 아닌 무언가에서 실행해야하거나 (b) bash 쉘을 사용하지 않고 (예 : zsh 사용) 경우에만 중요합니다. bash에서 실행 해야하는 것을 실행하십시오.
austin1howard

그러나 내 의견으로는 shebang을 포함하는 것이 좋습니다. 코드를 읽는 사람이 무슨 일이 일어나고 있는지 알 수 있습니다.
austin1howard

2
잘못됨 : execve(2)syscall이 $SHELL변수를 사용하지 않습니다 . shebang을 해석하는 것이 커널입니다.
Basile Starynkevitch

1
올바른 @BasileStarynkevitch, 커널의 엘프 로더는 shebang을 해석합니다. 나는 shebang이 제공되지 않으면 $ SHELL이 사용될 것이라고 말했습니다.
austin1howard

19

오두막은 애프터 지정된 프로그램을 사용하는 로더에 대한 지침입니다 #!당신이 그것을 실행하려고 할 때 해당 파일에 대한 인터프리터 등을. 그래서, 당신은라는 파일을 실행하려고하면 foo.sh#!/bin/bash실행이 있음을 상단에, 실제 명령을 /bin/bash foo.sh. 이것은 프로그램마다 다른 통역사를 사용하는 유연한 방법입니다. 이것은 시스템 수준에서 구현 된 것이며 사용자 수준 API는 shebang 규칙입니다.

또한 shebang이 마법 번호 , 즉 파일을 주어진 인터프리터의 스크립트로 식별하는 사람이 읽을 있는 마법 번호 라는 것을 아는 것도 가치가 있습니다.

shebang 없이도 "작동"에 대한 요점은 문제의 프로그램이 사용중인 쉘과 동일한 쉘로 작성된 쉘 스크립트이기 때문입니다. 예를 들어, 자바 스크립트 파일을 잘 작성한 다음 #! /usr/bin/js자바 스크립트 "Shell script"를 갖도록 (또는 비슷한 것을) 넣을 수 있습니다.


18

운영 체제는 쉘 스크립트를 실행하기 위해 기본 쉘을 사용합니다. 스크립트 시작 부분에 쉘 경로를 언급하면 ​​OS에 특정 쉘을 사용하도록 요청합니다. 이식성 에도 유용 합니다 .


15

모든 배포에는 기본 셸이 있습니다. Bash는 대부분의 시스템에서 기본값입니다. 기본 쉘이 다른 시스템에서 작업하는 경우 스크립트가 Bash 전용으로 작성된 경우 스크립트가 의도 한대로 작동하지 않을 수 있습니다.

Bash는 kshand 에서 코드를 가져 오면서 수년에 걸쳐 진화했습니다 sh.

#!/bin/bash스크립트의 첫 번째 행으로 추가 하면 OS에서 지정된 스크립트를 호출 shell하여 스크립트에서 따르는 명령을 실행하도록 지시합니다.

#! "해시 뱅", "시뱅"또는 "샤방"이라고도합니다.


9

그것은 shebang 이라고합니다 . 숫자 기호와 느낌표 문자 (#!)로 구성되며 / bin / bash와 같은 인터프리터의 전체 경로가 이어집니다. UNIX 및 Linux의 모든 스크립트는 첫 번째 행에 지정된 인터프리터를 사용하여 실행됩니다.



0

해당 라이브러리를 즉시 사용할 수없는 다른 시스템을 사용하는 사람에게 유용 할 수 있습니다. 이것이 선언되지 않고 스크립트에서 해당 시스템이 지원하지 않는 함수가있는 경우 # / bin / bash를 선언해야합니다. 나는 직장 에서이 문제에 부딪 쳤으며 이제는 실습으로 포함시킵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.