답변:
이식성을#!/usr/bin/env bash
위해 사용해야 합니다 . 다른 * nix가 bash
다른 곳에 배치되어 있고를 사용하는 /usr/bin/env
것이 첫 번째 bash
발견 된 해결책 PATH
입니다. 그리고 sh
아닙니다bash
.
/bin/sh
.
bash
는 /bin
모든 시스템에 존재 하지 않습니다 .
alias shebang='echo "#!/usr/bin/env bash"'
이제 터미널을 열고 여기에가는 대신 shebang을 입력하면됩니다.
env
에있다 /usr/bin/env
. 그것은에서 할 수있는 /bin/env
만큼이 경로에서와 같이, 또는 어디서든 사실. 그것은에서있을 수 /dummy/env
있는 경우 /dummy
이다 PATH
. Shebang 자체는 POSIX에서 정의되지 않았으므로 #!stop toaster
USB 커피 머신 을 시작하고 POSIX를 준수 할 수 있습니다. 따라서 #!/usr/bin/env bash
보다 나은 것은 아니지만 #!/bin/bash
이식성이 떨어질 수 있습니다.
/usr/bin/env
보다 많은 머신에 존재 /bin/bash
하므로이 /usr/bin/bash
줄로 시작하는 스크립트는 가능한 많은 머신에서 예상되는 작업을 수행합니다.
/bin/sh
일반적으로 시스템의 기본 쉘에 대한 링크 bash
입니다. 예를 들어, 데비안 시스템은 더 가볍습니다 dash
. 어느 쪽이든, 원래 Bourne 쉘은입니다 sh
. 따라서 스크립트가 일부 bash
(2 세대, "Bourne Again sh") 특정 기능 ( [[ ]]
테스트, 배열, 다양한 설탕 등)을 사용하는 경우보다 구체적이고 나중에 사용해야합니다. . 이 방법으로 bash가 설치되지 않은 시스템에서는 스크립트가 실행되지 않습니다. 나는이 진화에 관한 영화에 대한 흥미로운 3 부작이있을 수 있다는 것을 이해하지만, 그것은 소문이 될 수 있습니다.
또한으로 유발하는 경우주의 sh
, bash
어느 정도에 POSIX 표준으로 동작합니다 sh
(참조 는 GNU 문서 이 약을).
/bin/sh
/usr
/usr
/bin
과/sbin
단지에 기본적으로 심볼릭 링크왔다 년 동안 /usr/bin
하고 /usr/sbin
그래서 맥락에서, /bin/sh
에 대한 링크입니다 bash
과 실제 디렉토리는 /usr/bin
입니다. 그러나 위의 내용을 수정하겠습니다.
다음을 사용하는 것이 좋습니다.
#!/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
참고 : 데비안 및 데비안 기반 시스템 (예 : 우분투) sh
은 dash
not에 링크되어 bash
있습니다. 모든 시스템 스크립트가 사용 sh
합니다. 데비안에 따르면 bash가 커지고 시스템이 안정적으로 유지됩니다.
또한 호출을 유지하려면 shebang 호출 스크립트에서 파일 확장명을 절대 사용하지 않는 것처럼 Windows에서와 같이 실행 파일에서 호출시 확장명을 생략 할 수 없습니다. 파일 명령은이를 스크립트로 식별 할 수 있습니다.
bash 스크립트 작성 방법에 따라 다릅니다. /bin/sh
bash가 bash에 링크되어 있으면 bash가로 호출 sh
되면 일부 기능을 사용할 수 없습니다. .
bash 고유의 비 POSIX 기능을 원하면 #!/bin/bash
pkg_add
위치 /usr/local/bin
할 수 있습니다.
POSIX
기능?
/usr/local/bin/bash
OpenBSD에도 있습니다.