당신은 그것을 뒤로했습니다. /bin/sh요즘 Bourne 쉘은 거의 없으며, #! /bin/sh그녀가 뱅뱅 을 사용할 때 문제가 생길 때 ¹입니다 .
Bourne 쉘은 70 년대 후반에 작성된 쉘이며 이전 Thompson 쉘 (이라고도 함 sh)을 대체했습니다 . 80 년대 초 David Korn은 Bourne 쉘에 대한 몇 가지 확장을 작성하고 버그를 수정하고 어색함을 디자인하고 일부를 소개했으며이를 Korn 쉘이라고했습니다.
90 년대 초 POSIX 는 Korn 쉘의 서브 세트를 기반으로 sh 언어 를 지정했으며 대부분의 시스템은 이제 /bin/shKorn 쉘 또는 해당 스펙을 준수하는 쉘로 변경했습니다 . BSD의 경우 /bin/sh, 처음에는 라이센스를 이유로 Bourne 쉘을 더 이상 사용할 수 없게 된 후 점차적으로 변경 되었으며, 일부 ksh 확장자를 가진 Bourne 쉘의 복제 본인 Almquist 쉘은 POSIX 호환이되었습니다.
오늘날 모든 POSIX 시스템 은 대부분 POSIX를 준수 하는 쉘 sh(대부분은 아니지만 /binPOSIX가 지정한 유틸리티의 경로를 지정하지는 않음)을 가지고 있습니다. 일반적으로 ksh88, ksh93, pdksh, bash, ash 또는 zsh²을 기반으로하지만 Bourne 쉘은 POSIX 호환 ³이 아니기 때문에 Bourne 쉘이 아닙니다. 그 껍질의 일부는 ( bash, zsh, yash일부 pdksh로 호출 할 때 파생 상품은 POSIX 호환 모드를 사용 sh하고 있습니다 덜 그렇지 않으면 호환).
bash(Korn 쉘에 대한 GNU 답변)은 실제로 유일한 오픈 소스 쉘이며 다른 하나는 일반적으로 90 년대 이후 새로운 기능을 얻지 못한 ksh88을 기반으로하기 때문에 현재 유지되고 있다고 말할 수 있습니다. POSIX 호환 sh(macOS 인증의 일부).
#! /bin/sh -she-bang 으로 스크립트를 작성할 때 표준 sh구문을 사용해야합니다 (또한 이식성을 원할 경우 해당 스크립트에서 사용되는 유틸리티에 대해 표준 구문을 사용해야합니다. 쉘을 해석 할 때 관련된 쉘만이 아니라) 스크립트), 표준 sh구문 해석기의 구현 이 사용되는 것은 중요하지 않습니다 ( ksh, bash...).
해당 쉘이 사용하지 않는 한 표준에 대한 확장명을 갖는 것은 중요하지 않습니다. 표준 C 코드를 작성하고 하나의 컴파일러 (예 :) gcc또는 다른 컴파일러의 확장자를 사용하지 않는 한 C 코드 작성과 같습니다 . 컴파일러가 호환되는 경우 컴파일러 구현에 관계없이 코드 가 정상적으로 컴파일됩니다.
여기, 당신과 #! /bin/sh그녀 - 쾅, 주요 문제는 시스템이 될 것입니다 /bin/shBourne 쉘입니다 인스턴스를 같은 표준 기능을 지원하지 않습니다에 대한 $((1+1)), $(cmd), ${var#pattern}... 당신이 직장 차선책을 같이해야 할 수 있습니다 경우 :
#! /bin/sh -
if false ^ true; then
# in the Bourne shell, ^ is an alias for |, so false ^ true returns
# true in the Bourne shell and the Bourne shell only.
# Assume the system is Solaris 10 (older versions are no longer maintained)
# You would need to adapt if you need to support some other system
# where /bin/sh is the Bourne shell.
# We also need to fix $PATH as the other utilities in /bin are
# also ancient and not POSIX compatible.
PATH=`/usr/xpg6/bin/getconf PATH`${PATH:+:}$PATH || exit
export PATH
exec /usr/xpg4/bin/sh "$0" "$@"
# that should give us an environment that is mostly compliant
# to the Single UNIX Specification version 3 (POSIX.2004), the
# latest supported by Solaris 10.
fi
# rest of the script
그건 그렇고, 우분투 /bin/sh는 bash기본적으로 아닙니다 . 그건 dash요즘, NetBSD의 기반으로 쉘 sh대부분이 멀티 바이트 문자를 지원하지 않는다는 점을 제외 POSIX를 준수하는 Almquist 쉘에 따라 자체. 우분투와 다른 데비안 기반 시스템에서, 당신은 선택할 수 있습니다 bash및 dash위해 /bin/sh에 dpkg-reconfigure dash) 4 . sh데비안과 함께 제공되는 스크립트는 데비안 정책 표준 (POSIX 표준의 상위 집합)에 쓰여질 때 두 쉘에서 모두 동일하게 작동해야합니다. 당신은 아마 작업에서 확인 또한을 찾을 수 zsh의 sh에뮬레이션이나 bosh(아마 ksh93도 yash하지 않는 local데비안 정책이 아닌 POSIX)에 필요한 내장을 ().
unix.stackexchange.com 범위의 모든 시스템에는 POSIX sh 가 있습니다. 그들 대부분은 /bin/sh( /bin디렉토리가 없지만 매우 신경 쓰지 않는 매우 드문 것들을 가지고 있으며 ) 일반적으로 POSIX sh인터프리터 (그리고 드문 경우이지만 (비표준) Bourne 쉘) ).
그러나 sh시스템에서 찾을 수있는 유일한 쉘 인터프리터 실행 파일입니다. 다른 셸의 경우 macOS, Cygwin 및 대부분의 GNU / Linux 배포판에을 포함 할 수 있습니다 bash. SYSV 파생 OS (Solaris, AIX ...)에는 일반적으로 ksh88, 가능하면 ksh93이 있습니다. OpenBSD, MirOS는 pdksh 파생물을 갖습니다. macOS는 zsh. 그러나 그 중에서는 보장 할 수 없습니다. bash다른 쉘이 /bin다른 곳에 설치 될 것인지의 여부는 보증하지 않습니다 ( /usr/local/bin예를 들어 설치 될 때 일반적 으로 BSD 에서 찾을 수 있습니다 ). 물론 설치 될 쉘 버전을 보장하지는 않습니다.
(가) 점에 유의 #! /path/to/executable하지 않은 것입니다 규칙은 , 그것은의 기능의 모든 유닉스 계열 (커널 데니스 리치에 의해 80 년대 초반에 도입 과 함께 첫 번째 줄의 시작에 인터프리터의 경로를 지정하여 임의의 파일을 실행 허용) #!. 모든 실행 파일이 될 수 있습니다.
당신이 그 첫 줄을 시작으로 파일을 실행하면 #! /some/file some-optional-arg, 커널은 실행 끝 /some/file으로 some-optional-arg스크립트의 경로와 인수로서 원래 인수. 첫 번째 줄 #! /bin/echo test을 만들어 무슨 일이 일어나고 있는지 볼 수 있습니다 .
$ ./myscript foo
test ./myscript foo
/bin/sh -대신에 를 사용 /bin/echo test하면 커널은을 실행 /bin/sh - ./myscript foo하고 sh저장된 내용 코드를 해석 myscript하며 주석 인 첫 번째 줄을 무시합니다 (로 시작 #).
¹ 오늘날 우리 중 누구라도 /bin/shBourne 쉘을 기반으로하는 시스템은 Solaris 10입니다. Solaris는 이전 버전과의 호환성을 위해 Bourne 쉘을 유지하기로 결정한 소수의 Unice 중 하나입니다 (POSIX sh언어는 완전하지 않습니다) Bourne 쉘과의 역 호환 가능) (적어도 데스크탑 및 전체 서버 배치의 경우)에는 POSIX가 sh다른 곳에 /usr/xpg4/bin/sh있지만 (ksh88 기반) Solaris 11에서 변경되었으며 /bin/sh현재 ksh93입니다. 다른 것들은 대부분 기능이 없습니다.
² 예전 맥 OS / X의 , 나중에 변경 . POSIX 구현 으로 사용되는 것은 주요 초점 이 아닙니다 . 이 모드는 주로 스크립트에 POSIX 코드 를 포함하거나 호출 할 수 있어야합니다./bin/shzshbashzshshshsourceshzsh
³ 최근 @schily 는 OpenSolaris 쉘 (Bourne 쉘을 기반으로 한 SVR4 쉘 기반)을 POSIX 호환으로 확장 bosh했지만 , 아직 어떤 시스템에서도 사용되고 있다는 것을 알지 못합니다. 이것과 함께 ksh88Bourne 쉘의 코드를 기반으로 두 번째 POSIX 호환 쉘이됩니다.
4 이전 버전에서는 mkshPOSIX lksh화신을 사용 하거나 더 많이 사용할 수도 있습니다 . 이것이 pdksh 기반의 MirOS (이전 MirBSD) 셸이며, 그 자체는 Forsyth 쉘 (본인 쉘의 또 다른 구현)을 기반으로합니다)