당신은 그것을 뒤로했습니다. /bin/sh
요즘 Bourne 쉘은 거의 없으며, #! /bin/sh
그녀가 뱅뱅 을 사용할 때 문제가 생길 때 ¹입니다 .
Bourne 쉘은 70 년대 후반에 작성된 쉘이며 이전 Thompson 쉘 (이라고도 함 sh
)을 대체했습니다 . 80 년대 초 David Korn은 Bourne 쉘에 대한 몇 가지 확장을 작성하고 버그를 수정하고 어색함을 디자인하고 일부를 소개했으며이를 Korn 쉘이라고했습니다.
90 년대 초 POSIX 는 Korn 쉘의 서브 세트를 기반으로 sh
언어 를 지정했으며 대부분의 시스템은 이제 /bin/sh
Korn 쉘 또는 해당 스펙을 준수하는 쉘로 변경했습니다 . BSD의 경우 /bin/sh
, 처음에는 라이센스를 이유로 Bourne 쉘을 더 이상 사용할 수 없게 된 후 점차적으로 변경 되었으며, 일부 ksh 확장자를 가진 Bourne 쉘의 복제 본인 Almquist 쉘은 POSIX 호환이되었습니다.
오늘날 모든 POSIX 시스템 은 대부분 POSIX를 준수 하는 쉘 sh
(대부분은 아니지만 /bin
POSIX가 지정한 유틸리티의 경로를 지정하지는 않음)을 가지고 있습니다. 일반적으로 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/sh
Bourne 쉘입니다 인스턴스를 같은 표준 기능을 지원하지 않습니다에 대한 $((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/sh
Bourne 쉘을 기반으로하는 시스템은 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/sh
zsh
bash
zsh
sh
sh
source
sh
zsh
³ 최근 @schily 는 OpenSolaris 쉘 (Bourne 쉘을 기반으로 한 SVR4 쉘 기반)을 POSIX 호환으로 확장 bosh
했지만 , 아직 어떤 시스템에서도 사용되고 있다는 것을 알지 못합니다. 이것과 함께 ksh88
Bourne 쉘의 코드를 기반으로 두 번째 POSIX 호환 쉘이됩니다.
4 이전 버전에서는 mksh
POSIX lksh
화신을 사용 하거나 더 많이 사용할 수도 있습니다 . 이것이 pdksh 기반의 MirOS (이전 MirBSD) 셸이며, 그 자체는 Forsyth 쉘 (본인 쉘의 또 다른 구현)을 기반으로합니다)