선호하는 Bash shebang은 무엇입니까?


1131

있어요 Bash 오두막 객관적으로 더 나은 대부분의 용도에 대한 다른 사람보다?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • 기타

나는 끝에 대시를 추가하면 누군가가 당신의 스크립트에 명령을 전달하지 못하지만 그에 대한 세부 사항을 찾을 수 없다는 것을 들었습니다.


4
그리고 /usr/local/bin/bashOpenBSD에도 있습니다.
jww

답변:


1535

이식성을#!/usr/bin/env bash 위해 사용해야 합니다 . 다른 * nix가 bash다른 곳에 배치되어 있고를 사용하는 /usr/bin/env것이 첫 번째 bash발견 된 해결책 PATH입니다. 그리고 sh아닙니다bash .


9
감사. 또한 $! / usr / bin / env bash 끝에 추가하는 것처럼 보입니다. shebang에서 * nix는 하나의 인수 만 허용하고 'bash'는이를 사용하므로 아무 것도하지 않습니다. 스크립트의 shebang이 인수가없는 다른 스크립트 중 하나 인 경우 명령 줄에서 악성 인수가 스크립트에 전달되지 않도록하는 데 유용합니다 /bin/sh.
Kurtosis

13
@Ray bash/bin모든 시스템에 존재 하지 않습니다 .
ptierno

12
나에게도 방금 별명에 추가했습니다. alias shebang='echo "#!/usr/bin/env bash"'이제 터미널을 열고 여기에가는 대신 shebang을 입력하면됩니다.
Oylex

19
이 대답은 기만적입니다. POSIX는 말을하지 않습니다 env에있다 /usr/bin/env. 그것은에서 할 수있는 /bin/env만큼이 경로에서와 같이, 또는 어디서든 사실. 그것은에서있을 수 /dummy/env있는 경우 /dummy이다 PATH. Shebang 자체는 POSIX에서 정의되지 않았으므로 #!stop toasterUSB 커피 머신 을 시작하고 POSIX를 준수 할 수 있습니다. 따라서 #!/usr/bin/env bash보다 나은 것은 아니지만 #!/bin/bash이식성이 떨어질 수 있습니다.
darkfeline

19
@darkfeline 이식성이 절대적인 것은 아닙니다. 모든 플랫폼에서 동일한 기능을하는 스크립트를 만드는 것은 수학적으로 불가능합니다. 2012 년부터 2018 년까지 xor /usr/bin/env보다 많은 머신에 존재 /bin/bash하므로이 /usr/bin/bash줄로 시작하는 스크립트는 가능한 많은 머신에서 예상되는 작업을 수행합니다.
l0b0

80

/bin/sh일반적으로 시스템의 기본 쉘에 대한 링크 bash입니다. 예를 들어, 데비안 시스템은 더 가볍습니다 dash. 어느 쪽이든, 원래 Bourne 쉘은입니다 sh. 따라서 스크립트가 일부 bash(2 세대, "Bourne Again sh") 특정 기능 ( [[ ]]테스트, 배열, 다양한 설탕 등)을 사용하는 경우보다 구체적이고 나중에 사용해야합니다. . 이 방법으로 bash가 설치되지 않은 시스템에서는 스크립트가 실행되지 않습니다. 나는이 진화에 관한 영화에 대한 흥미로운 3 부작이있을 수 있다는 것을 이해하지만, 그것은 소문이 될 수 있습니다.

또한으로 유발하는 경우주의 sh, bash어느 정도에 POSIX 표준으로 동작합니다 sh (참조 는 GNU 문서 이 약을).


2
공개 도메인 Korn 쉘 (pdksh)은 OpenBSD에서 기본값입니다.
jww

대부분의 시스템은 init 스크립트 가 마운트 되기 전에 실행하기 가 다소 어려워 어느 곳에도 연결 되지 않습니다 . /bin/sh/usr/usr
aij September

내가 넣어 이유 @aij 나도 몰라 "많은 또는 대부분"이 - I 해요 페도라 사용자 곳 /bin/sbin 단지에 기본적으로 심볼릭 링크왔다 년 동안 /usr/bin하고 /usr/sbin그래서 맥락에서, /bin/sh에 대한 링크입니다 bash과 실제 디렉토리는 /usr/bin입니다. 그러나 위의 내용을 수정하겠습니다.
delicateLatticeworkFever

44

다음을 사용하는 것이 좋습니다.

#!/bin/bash

100 % 이식 가능하지는 않지만 (일부 시스템 bash은 이외의 위치에 배치 /bin) 기존 스크립트가 #!/bin/bash여러 운영 체제에서 압력을 사용 /bin/bash하여 최소한 기본 위치에 대한 심볼릭 링크를 만듭니다 .

대안 :

#!/usr/bin/env bash

제안되었지만- env명령이 있음을 보증하지는 않습니다 /usr/bin(그리고 나는 명령 이없는 시스템을 사용했습니다). 또한이 형식은 bash현재 사용자 의 첫 번째 인스턴스를 사용하는데 $PATH, 이는 bash 쉘의 적절한 버전이 아닐 수도 있습니다.

(그러나 /usr/bin/env하나 때문에, 합리적으로 현대적인 시스템에서 작동해야 env/usr/bin또는 시스템이 작동하게하는 무언가를하기 때문이다. 나는 아마 약 25 년 동안 사용하지 않은 SunOS의 4이었다에 위의 언급 된 시스템을.)

이없는 시스템에서 스크립트를 실행해야하는 경우 /bin/bash올바른 위치를 가리 키도록 스크립트를 수정할 수 있습니다 (불편하게도 불편 함).

나는에 더 깊이 장단점을 논의했습니다 내 대답이 질문에 .

다소 모호한 업데이트 : Android에서 실행되는 데스크톱 Linux와 유사한 레이어 인 Termux는 사용 하지 않는 시스템 중 하나입니다./bin/bash () bash/data/data/com.termux/files/usr/bin/bash없지만 지원하기위한 특별한 처리 기능이 #!/bin/bash있습니다.


3
2 년 후에도 이것이 여전히 최고의 조언입니다. 간단한 해결책이 효과가 없다면 이전의 결정에 의문을 제기해야합니다. 허용되는 가장 upvoted 대답은 : 그냥 바로, 잘못되지 않습니다
소프트웨어 엔지니어

27

shebang 행을 사용하여 적절한 인터프리터를 호출하는 것은 BASH만을위한 것이 아닙니다. 시스템에서 Perl, Python, PHP (CLI) 및 기타 여러 언어로 해석되는 언어에 shebang을 사용할 수 있습니다. 그건 그렇고, shebang

#!/bin/sh -

(또한 두 개의 대시 일 수 있음 --) bash 옵션을 종료하면 모든 것이 파일 이름과 인수로 처리됩니다.

env명령을 사용하면 스크립트를 이식 가능하게 만들고 스크립트에 대한 사용자 정의 환경을 설정할 수 있으므로 이식 가능한 스크립트는

#!/usr/bin/env bash

또는 Perl과 같은 언어에 관계없이

#!/usr/bin/env perl

다음 man페이지를 확인하십시오 bash.

man bash

그리고 env:

man env

참고 : 데비안 및 데비안 기반 시스템 (예 : 우분투) shdashnot에 링크되어 bash있습니다. 모든 시스템 스크립트가 사용 sh합니다. 데비안에 따르면 bash가 커지고 시스템이 안정적으로 유지됩니다.

또한 호출을 유지하려면 shebang 호출 스크립트에서 파일 확장명을 절대 사용하지 않는 것처럼 Windows에서와 같이 실행 파일에서 호출시 확장명을 생략 할 수 없습니다. 파일 명령은이를 스크립트로 식별 할 수 있습니다.


4

bash 스크립트 작성 방법에 따라 다릅니다. /bin/shbash가 bash에 링크되어 있으면 bash가로 호출 sh되면 일부 기능을 사용할 수 없습니다. .

bash 고유의 비 POSIX 기능을 원하면 #!/bin/bash


3
Bash는 OpenBSD에 설치되어 있지 않습니다. 를 통해 설치하면 경로가 아닌 경로에 pkg_add위치 /usr/local/bin할 수 있습니다.
jww

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