답변:
우선 Bash가 사전 설치되어 있다고 가정 할 수 있다면 (내가 알고있는 모든 시스템의 경우) 다음 해시 뱅을 사용하여 호환 가능합니다.
#!/usr/bin/env bash
이것은 bash
에 /bin
있거나에 관계없이 구성되는 모든 것을 호출합니다 /usr/local/bin
.
광범위한 시스템 (AIX, Solaris, 여러 BSD 버전 포함)의 대부분의 시스템 bash
에서 서로 다른 위치에있게되고 env
항상로 끝났습니다 /usr/bin/env
. 그러나 속임수는 내 것이 아니라 Bash Cookbook의 저자가 작성한 것입니다.
어쨌든 그렇습니다. Bash를 사용하면 삶을 편하게 만드는 "현대"기능을 사용할 수 있습니다.
예를 들어 이중 괄호 :
[[ -f "/etc/debian_version" ]] && echo "This is a Debian flavor"
반면에 전통적인 쉘 방언에서는 다음을 사용해야합니다.
test -f "/etc/debian_version" && echo "This is a Debian flavor"
그러나 대괄호에 대한 가장 좋은 점은 정규식을 일치시킬 수 있다는 것입니다. 강타 해커 위키는 그 방향으로 당신에게 많은 유용한 정보를 제공 할 것입니다.
구문 $((2**10))
에 따라 매우 편리한 표현식 이나 다른 산술 표현식을 사용할 수도 있습니다 $((expression))
.
조금 구식이지만 서브 쉘에 백틱을 사용하는 것이 좋습니다. 그러나 $(command ...)
다른 서브 쉘 레벨에서 많은 것을 피할 필요가 없기 때문에 호출 의 중첩 기능이 훨씬 편리합니다.
이것들은 Bash가 일반적인 일반적인 POSIX sh
구문에 대해 제공하는 몇 가지 사항 입니다.
그러나 스크립트뿐만 아니라 셸에서 더 많은 전원을 원한다면을 살펴보십시오 zsh
.
sh
등의 작업을 위해.
sh
연결된 시스템 bash
에서는을 사용하여 취약점을 완화하지 않습니다 sh
.
데비안과 우분투에서 /bin/sh
이다 dash
는 POSIX 호환 쉘이다. 을 지정 #!/bin/sh
하면 스크립트에서 자신을 POSIX 문으로 제한해야합니다. 장점 dash
은보다 빠르게 시작 bash
하므로 스크립트가 더 짧은 시간 안에 작업을 수행 할 수 있다는 것입니다 .
많은 (대부분?) 다른 Linux 시스템에서 /bin/sh
is bash
이므로 확장 #!/bin/sh
을 사용하더라도 많은 스크립트가 shebang 라인으로 작성됩니다 bash
.
bash
확장 을 사용하려면 모든 시스템에서 가장 안전한 방법은 다음을 지정하는 것입니다 #!/bin/bash
. 그렇게하면에 대한 의존성을 명시 적으로 나타 bash
냅니다. 당신은 필요 데비안과 우분투에서이 작업을 수행 할 수 있습니다. 추가 보너스로 시작하면 /bin/sh
bash
일부 확장 기능이 비활성화됩니다 (자세한 내용은 bash
POSIX 모드 설명 참조). 따라서 #!/bin/bash
를 최대한 활용하려면 지정 이 필요합니다 bash
.
OS X /bin/bash
에서도 사용할 수 있으며 /bin/sh
입니다 bash
. 지정 #!/bin/bash
하면 잘 작동합니다.
예, OSX와 Linux는 모두 함께 제공됩니다 /bin/bash
. 당신은 완벽하게 안전해야합니다. 그러나 이것은 POSIX 가 아닙니다 . POSIX 셸은 /bin/sh
대부분의 시스템에 있으며 POSIX 호환을위한 가장 쉬운 방법이며 유일한 방법입니다.
많은 시스템 /bin/sh
에서을 가리키고 bash
다른 시스템에서는 다른 쉘을 가리킬 수 있습니다. dash
예를 들어 데비안과 우분투에 대한 심볼릭 링크 입니다. 또한에 /bin/sh
대한 링크 인 경우에도 bash
쉘이 sh
(from man bash
, 강조 광산) 으로 호출되면 변경됩니다 .
bash가 sh라는 이름으로 호출되면 POSIX 표준도 준수하면서 sh의 히스토리 버전 시작 동작을 최대한 가깝게 모방하려고합니다. 대화식 로그인 쉘 또는 --login 옵션을 사용하는 비 대화식 쉘로 호출되면 먼저 / etc / profile 및 ~ / .profile의 명령을 순서대로 읽고 실행하려고 시도합니다. --noprofile 옵션을 사용하면이 동작을 막을 수 있습니다. 이름이 sh 인 대화식 쉘로 호출되면, bash는 변수 ENV를 찾고 값이 있으면 값을 확장합니다.
정의하고 확장 값을 읽고 실행할 파일 이름으로 사용합니다. sh로 호출 된 쉘은 다른 시작 파일에서 명령을 읽고 실행하려고 시도하지 않으므로 --rcfile 옵션은 적용되지 않습니다. sh라는 이름으로 호출 된 비 대화식 쉘은 다른 시작 파일을 읽으려고 시도하지 않습니다. sh로 호출하면 시작 파일을 읽은 후 bash가 posix 모드로 들어갑니다.
"모든 유닉스 시스템"과의 호환성이 절대적인 요구 사항 이고 그렇지 않은 경우 왜 쉘 스크립트를 작성 하는가? 그렇다면 #! /bin/sh
Bash는 물론 어디에서나 설치가 보장되지 않으므로 반드시 사용해야합니다 /bin
.
실제로 그것보다 훨씬 나쁩니다. 당신이 호환성을해야하는 경우 모든 유닉스 시스템, 즉, Solaris 및 AIX 같은 것들을 포함 자신의 쉘 환경을 동결 당신은 구식 같은 것들을 사용하는 것을 의미합니다 1995 년경 sort +N
있음 - 구문 새로운 시스템이 떨어졌다를! 그리고 그것은 쉘 함수, 배열, 아니오 [[ ... ]]
, 아니오 ${foo#glob}
, $(( ... ))
산술, 아니오 $( ... )
스타일 명령 대체, 큰 입력을 얻을 수있는 방법에 대한 작고 문서화되지 않은 상한을 의미 하지 않습니다 ...
당신은 아마와 귀찮게하지 멀리 얻을 수있는 그 많은 호환성하지만 처음에도 문제가 있다면, 나는 강하게 당신이 쉘보다 끔찍한 언어를 고려하는 것이 좋습니다. 기본 펄 인터프리터는 더 배쉬보다 사용할 수 있습니다 것.
/bin
하고/usr/bin
. 결과적으로#!/usr/bin/env <shname>
요즘 이식성 을 위해 사용 하는 것이 좋습니다 .