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

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

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

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



답변

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


답변

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

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


답변

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

#!/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있습니다.


답변

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에서와 같이 실행 파일에서 호출시 확장명을 생략 할 수 없습니다. 파일 명령은이를 스크립트로 식별 할 수 있습니다.


답변

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

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


답변