나는 원하는 쉘을 호출하기 위해 스크립트의 첫 번째 줄로 이들 중 하나를 사용할 수 있다는 것을 알고 있습니다.
#!/bin/sh
모든 UNIX 시스템과의 호환성이 절대적인 요구사항이라면 권장됩니까?
내가 관심을 갖는 운영 체제는 Ubuntu(Debian)와 OSX뿐입니다. 그렇다면 이를 사용해 #!/bin/bash
두 시스템 모두에서 작동한다고 보장할 수 있습니까?
이를 통해 보다 현대적이고 명확한 명령 구문을 사용하는 스크립트를 더 쉽게 사용할 수 있습니까? 사용이 #!/bin/sh
POSIX 사용과도 관련이 있습니까?
답변1
우선, Bash가 사전 설치되어 있다고 가정할 수 있는 경우(내가 아는 한 나열된 모든 시스템에 해당) 호환성을 위해 다음 해시뱅을 사용하십시오.
#!/usr/bin/env bash
이는 in이든 out이든 bash
상관없이 모든 구성 에서 호출됩니다 ./bin
/usr/local/bin
대부분의 시스템(AIX, Solaris, 여러 BSD 버전 포함)에서는 항상 bash
다른 위치에 있습니다 . 그러나 이 팁은 제가 쓴 것이 아니라 Bash Cookbook의 작성자가 제공한 것입니다.env
/usr/bin/env
어쨌든, 그렇습니다. 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
.
답변2
Debian과 Ubuntu에서는 /bin/sh
그렇습니다 dash
. POSIX 호환 쉘입니다. 지정하는 경우 #!/bin/sh
스크립트에서 POSIX 문으로 제한해야 합니다. (장점은 . dash
보다 빠르게 시작되므로 bash
스크립트가 더 짧은 시간에 작업을 수행할 수 있다는 것입니다.)
많은(대부분?) 다른 Linux 시스템에서는 그렇습니다. 이것이 바로 많은 스크립트 가 /bin/sh
확장자가 .bash
#!/bin/sh
bash
bash
확장 기능을 사용하려는 경우 모든 시스템에서 가장 안전한 방법은 #!/bin/bash
;bash
필요데비안과 우분투에서 이 작업을 수행하세요. 추가 보너스로 일부 확장 프로그램은 실행 시 비활성화됩니다 /bin/sh
bash
(참조:bash
POSIX 모드 설명자세히 알아보세요.) 따라서 #!/bin/bash
최대한 활용하려면 bash
.
OS X에서도 /bin/bash
사용할 수 있으며 /bin/sh
yes로 bash
지정해 #!/bin/bash
도 문제가 없습니다.
답변3
예, OSX와 Linux가 모두 제공됩니다 /bin/bash
. 절대적으로 안전할 것입니다. 그러나 그것은아니요POSIX. POSIX 셸은 /bin/sh
대부분의(모든?) 시스템에 존재하며 가장 이식성이 뛰어난 방법이자 POSIX와 호환되는 유일한 방법입니다.
/bin/sh
많은 시스템에서는 다른 쉘을 가리키지 만 bash
다른 시스템에서는 다른 쉘을 가리킬 수 있습니다. dash
예를 들어 Debian 및 Ubuntu의 심볼릭 링크입니다. 또한 /bin/sh
link 를 사용 하더라도 쉘 bash
이 호출될 때 쉘의 동작이 변경됩니다 sh
( from man bash
, 강조 내 항목).
bash가 sh 이름으로 호출되면 POSIX 표준을 준수하면서 sh의 이전 버전의 시작 동작을 최대한 가깝게 모방하려고 시도합니다. --login 옵션을 사용하여 대화형 로그인 셸 또는 비대화형 셸로 호출되면 먼저 /etc/profile 및 ~/.profile에서 명령을 순서대로 읽고 실행하려고 시도합니다. --noprofile 옵션을 사용하면 이 동작을 억제할 수 있습니다. sh라는 이름의 대화형 셸로 호출되면 bash는 변수 ENV를 찾고
해당 값이 정의되어 있으면 확장한 다음 확장된 값을 읽고 실행할 파일 이름으로 사용합니다. sh로 호출된 쉘은 다른 시작 파일에서 명령을 읽고 실행하려고 시도하지 않으므로 --rcfile 옵션은 효과가 없습니다. sh라는 이름으로 호출된 비대화형 쉘은 다른 시작 파일을 읽으려고 시도하지 않습니다. sh로 호출되면 bash는 시작 파일을 읽은 후 posix 모드로 들어갑니다.
답변4
"모든 Unix 시스템"과의 호환성이 절대적으로 요구되는 경우 -그렇지 않다면 왜 쉘 스크립트를 작성하고 있습니까?-- 그렇다면 #! /bin/sh
Bash 설치가 보장되지 않으므로 를 사용해야 합니다.어딘가에는 물론이고 /bin
.
실제로는 그보다 훨씬 더 나쁩니다. 호환성이 필요한 경우모두Solaris 및 AIX 등을 포함한 Unix 시스템쉘 환경 동결1995년경. 이는 sort +N
구식 구문과 같은 것을 사용해야 함을 의미합니다 .최신시스템이 오프라인 상태입니다! 이는 또한 쉘 함수 없음, 배열 없음, [[ ... ]]
산술 ${foo#glob}
없음 $(( ... ))
, 스타일 명령 대체 없음 $( ... )
, 작고 문서화되지 않은 입력 크기 상한 등을 의미합니다.
넌 귀찮게 하지 않고 도망갈 수 있을지도 몰라저것호환성은 훌륭하지만 이것이 처음부터 문제라면 셸보다 안전한 언어를 고려해 보시기를 강력히 권합니다. 기본 Perl 인터프리터는 다음과 같습니다.더아마도 Bash보다 더 유용할 것입니다.