“sh 호환”이라는 것은 무엇을 의미합니까?


63

필자는 일반적으로 쉘과 관련하여 사용되는 "sh compatible"이라는 문구를 보았습니다. 쉘 내에서 실행될 수있는 프로그램에도 적용되는지 확실하지 않습니다.

쉘이나 다른 프로그램이 "sh 호환"한다는 것은 무엇을 의미합니까? "호환되지 않는다"는 것은 무엇을 의미합니까?

편집 : bash와 sh의 차이점을 묻는이 질문은 매우 관련이 있습니다 : sh와 bash의 차이점

나는 여전히 "sh 호환"의 의미에 대한 직접적인 답변을 원합니다. "sh 호환"은 "Shell 명령 언어 구현"을 의미하지만 "sh 호환"쉘이 너무 많은 이유와 다른 이유는 합리적입니다.


1
쉘 스크립트의 경우 해당 스크립트가 Bourne Shell ( sh) 과 호환되는 (실행 가능한) 구문을 사용하는지 여부를 나타냅니다 . 다른 쉘의 경우 해당 쉘이 Bourne 쉘 스크립트를 실행할 수 있는지 여부를 나타냅니다.
HalosGhost

포탄의 발명가를 배우고 싶다면 unix.stackexchange.com/questions/45684/
PersianGulf

답변:


116

왜 "sh 호환"쉘이 그렇게 많은가?

Bourne 쉘은 처음 공개의 일환으로 1979 년에 출시 된 유닉스 V7 . 거의 모든 유닉스와 유닉스 계열 시스템 은 V7 유닉스에서 유래 한 것이므로 ( 영적으로 만하 더라도) Bourne 쉘은 우리와 함께 "영원히"존재했습니다 ¹¹

Bourne 쉘은 실제로 이전 쉘을 대체 하여 Thompson 쉘 을 다시 정의했지만 Unix의 역사에서 너무 일찍 발생하여 오늘날까지 잊혀졌습니다. Bourne 쉘은 Thompson 쉘의 상위 세트입니다

Bourne과 Thompson 포탄을 모두 호출했습니다 sh. POSIX에 의해 지정된 쉘 이라고도한다 sh. 따라서 누군가가 sh호환 가능 하다고 말하면 이 일련의 껍질을 손으로 말하고 있습니다. 그들이 구체적이기를 원한다면, 그들은 "POSIX shell"또는 "Bourne shell"이라고 말할 것입니다 .³

POSIX의 쉘이 1988 버전을 기반 콘 셸 차례로 비약, 보른은 AT & T 유닉스 셸 대체하는 것을 의미하고, BSD의 C 쉘 하는 범위 features.⁴ 환산 kshPOSIX의 쉘의 조상을 가장 유닉스와 유닉스 계열 시스템은 오늘날 Korn 쉘의 변형을 포함합니다. 예외적으로 일반적으로 POSIX 셸이 차지하는 공간을 확보 할 수없는 소형 임베디드 시스템은 예외입니다.

즉, POSIX 쉘과는 다른 Korn 쉘은 실제로 상용 Unix 세계에서 인기를 얻지 못했습니다. 이는 유닉스 상용화의 초기 단계와 일치했기 때문에 유닉스 전쟁휘 말렸 기 때문 입니다. BSD 유닉스는 C 쉘을 선호하여이를 피했으며, 소스 코드는 Linux가 시작될 때 무료로 사용할 수 없었습니다 .⁵ 초기 Linux 배포자가 Linux 커널과 함께 사용할 명령 쉘을 찾았을 때, 그들은 일반적으로 당신이 이야기하고 있는 호환 가능한 것 중 하나 인 GNU Bash를 선택했습니다 sh.⁶

Linux와 Bash의 초기 연관성은 ksh, csh및을 포함한 다른 많은 쉘의 운명을 거의 봉인했습니다 tcsh. 오늘날에도 여전히 그 껍질을 사용하는 다이 하드가 있지만 소수에 불과합니다.

등 상대적으로 후발 업체의 제작자 왜이 모든 역사를 설명 bash, zsh그리고이 yash그들을 만들하기로 결정했습니다 sh호환 : Bourne의 / POSIX 호환 유닉스 계열 시스템에 대한 쉘이 널리 채택을 얻기 위해 제공해야하는 최소이다.

많은 시스템에서 기본 대화식 명령 셸 /bin/sh은 서로 다릅니다. /bin/sh아마도:

  • 본 Bourne 쉘. 이는 Solaris 10 (2005 년 릴리스)과 같은 이전 UNIX® 시스템 및 그 이전 버전에서 일반적입니다.

  • POSIX 인증 쉘. 이는 Solaris 11 (2010)과 같은 최신 UNIX® 시스템에서 일반적입니다.

  • Almquist 쉘 . 이것은 오픈 소스 Bourne / POSIX 셸 복제본 으로 1989 년 Usenet에서 처음 릴리스되었으며 AT & T 소스 코드 4.4BSD-Lite가 포함되지 않은 첫 번째 BSD 릴리스에 포함 된 Berkeley의 CSRG 에 기여했습니다 . Almquist 쉘은로 설치되어 있어도 종종 호출 됩니다 .ash/bin/sh

    4.4BSD-Lite는 모든 현대 BSD 파생 상품의 기반이되었으며, /bin/sh대부분 아래에서 Almquist 파생 상품 으로 남아 있지만 아래에 한 가지 예외가 있습니다. NetBSDFreeBSD 의 소스 코드 리포지토리에서 이러한 직접적인 자손을 볼 수 있습니다 . 1 일부터 Almquist 쉘 파생물을 선적했습니다.

    ashBSD 세계 외부 에는 두 가지 중요한 포크가 있습니다.

    1. dash, 유명 데비안과 우분투에 의해 채택 된 기본으로 2006 년에 /bin/sh구현입니다. (Bash는 Debian 파생 상품 의 기본 대화식 명령 쉘로 남아 있습니다 .)

    2. 임베디드 리눅스 에서 자주 사용되며 구현하는 데 사용될 수있는 BusyBoxash명령 입니다 . 그것은 postdates 이고 데비안의 오래된 패키지 에서 파생 되었기 때문에 BusyBox 내의 명령 이름에도 불구하고 오히려 파생 제품으로 간주하기로 결정했습니다 ./bin/shdashashdashash

      (BusyBox는 ash호출 하기에 덜 기능적인 대안도 포함합니다 hush. 일반적으로 둘 중 하나만 BusyBox 바이너리에 내장됩니다 : ash기본적으로 hush공간이 매우 빡빡 할 때 /bin/shBusyBox 기반 시스템은 항상 dash같은 것은 아닙니다 .)

  • GNU 배쉬 , 로 전화했을 때의 비 POSIX 확장의 대부분을 비활성화합니다sh .

    이 선택은 데비안 및 그 파생물을 제외하고 Linux의 데스크탑 및 서버 변형에서 일반적입니다. Mac OS X은 2003 년에 출시 된 Panther 이후로이 작업을 수행했습니다.

  • 와 쉘 ksh93POSIX의 확장 으로, 오픈 BSD에서 . OpenBSD 셸은로 호출 될 때 Bourne 및 POSIX 셸과 구문 및 시맨틱 비 호환성을 피하기 위해 동작을 변경하지만 sh이전 셸과 충돌하지 않는 순수한 확장을 비활성화하지 않습니다.

    이것은 일반적이지 않습니다. 의 ksh93기능을 기 대해서는 안됩니다 /bin/sh.

위의 "쉘 스크립트"를 Bourne / POSIX 쉘 스크립팅을 의미하는 일반적인 용어로 사용했습니다. 이것은 Bourne 제품군 쉘의 편재성 때문입니다. 다른 쉘에서의 스크립팅에 대해 이야기하려면 "C 쉘 스크립트"와 같은 한정자를 제공해야합니다. C 패밀리 쉘이 기본 대화식 쉘인 시스템에서도 스크립트를 위해 Bourne 쉘을 사용하는 것이 좋습니다 .

Wikipedia가 유닉스 쉘을 분류 할 때 , 그것들을 Bourne 쉘 호환, C 쉘 호환 및 "other"로 그룹화한다고합니다.

이 다이어그램이 도움이 될 수 있습니다.

유닉스 쉘 : Bourne, Korn, POSIX, C 및 rc Shell 제품군

SVG 버전, 31kB를 클릭하거나 전체 크기 PNG 버전 , 218kB를 보려면 클릭하십시오 .

"호환되지 않는다"는 것은 무엇을 의미합니까?

sh호환되지 않는 것에 대해 이야기하는 사람은 일반적으로 다음 세 가지 중 하나를 의미합니다.

  1. 그들은 그 "다른"껍질 중 하나를 언급하고 있습니다.

  2. 그들은 Bourne과 C 쉘 제품군을 구별하고 있습니다.

  3. 그들은 다른 Bourne 제품군 쉘에 포함되지 않은 Bourne 제품군 쉘의 특정 기능에 대해 이야기하고 있습니다. ksh93, bashzsh특히 기존의 "표준"껍질에 존재하지 않는 많은 기능을 가지고 있습니다. 공유 POSIX / ksh88기반을 넘어 서면이 세 가지도 많은 방식으로 서로 호환되지 않습니다 .

상단에 #!/bin/sh shebang 줄 을 가진 쉘 스크립트를 작성 하지만 Bash 또는 Korn 쉘 확장을 사용 하는 것은 고전적인 오류 입니다. /bin/sh요즘 많은 시스템에서 Korn / POSIX 제품군 다이어그램의 쉘 중 하나 이기 때문에 이러한 스크립트는 작성된 시스템에서 작동하지만 /bin/sh더 넓은 Bourne 쉘 제품군의 시스템에서는 작동하지 않습니다 . 스크립트가 이러한 확장을 사용하는 경우 가장 좋은 방법은 행을 사용 #!/bin/bash하거나 #!/bin/kshshebang하는 것입니다.

지정된 Bourne 제품군 쉘 스크립트가 이식 가능한지 여부를 확인하는 방법에는 여러 가지가 있습니다.

  • checkbashisms스크립트에서 " bashisms "를 검사하는 데비안 프로젝트의 도구로 실행하십시오 .

  • SUS3posh의해 지정된 기능들 과 몇 가지 다른 사소한 기능 들만을 의도적으로 구현하는 데비안 패키지 저장소의 쉘에서 실행하십시오 .

  • 2005 년 Sun에서 OpenSolaris의 일부로 오픈 소스로 개선 한 Bourne 쉘의 개선 된 버전 인 Schily Tools 프로젝트osh 에서 이를 실행 하여 최신 컴퓨터에서 1979 스타일의 Bourne 쉘을 얻는 가장 쉬운 방법 중 하나입니다.

    Schily Tools 배포판에는 또한 많은 비표준 기능을bosh 가진 POSIX 유형 쉘이 포함되어 있지만 모든 POSIX 제품군 쉘에서 실행되는 쉘 스크립트의 호환성을 테스트하는 데 유용 할 수 있습니다. 그것은 그것보다 설정 기능에서 더 보수적 인 경향 , 그리고의 향상된 버전 .bashzshksh93

    Schily Tools에는 또한라는 쉘이 포함되어 bsh있지만 이는 Bourne 제품군 쉘이 아닌 역사적 이상 입니다.

  • GNU Autoconf 매뉴얼Portable Shell Programming 장을 살펴보십시오 . 스크립트에서 이야기하는 문제가있는 구문 중 일부를 인식 할 수 있습니다.

왜 다른가요?

같은 이유로 모든 "새롭고 개선되었습니다!" 상황이 다릅니다 :

  • 개선 된 버전은 이전 버전과의 호환성을 깨뜨려야 개선 될 수있었습니다.

  • 누군가는 무언가 더 잘 작동하는 방식을 생각했지만 더 좋아하지만 이전 방식과는 다릅니다.

  • 누군가는 표준을 완전히 이해하지 않고 오래된 표준을 다시 구현하려고 시도했기 때문에 의도하지 않은 차이가 생겼습니다.


각주와 따로 :

  1. 초기 버전의 BSD Unix 는 V6 Unix 용 애드온 소프트웨어 모음 일뿐입니다. V7까지 Bourne 쉘이 AT & T Unix에 추가되지 않았기 때문에 BSD는 기술적으로 Bourne 쉘을 가지지 않았습니다. Thompson 쉘의 기본 특성에 대한 BSD의 대답 은 C 쉘 이었습니다.

    그럼에도 불구하고, 최초의 독립형 BSD 버전 (2.9BSD 및 3BSD)은 V7 또는 이식 가능한 후속 UNIX / 32V 기반 이므로 Bourne 쉘 포함되었습니다.

    합니다 (2BSD 라인은 디지털의에 대한 BSD의 병렬 포크로 바뀌 PDP의 미니 3BSD와 4BSD 선이 같은 새로운 종류의 컴퓨터의 활용에가는 동안, Vaxen유닉스 워크 스테이션 2.9BSD는 기본적으로 4.1cBSD의 PDP 버전이었다. 그들은했다 동시 및 공유 코드 . VAX가 도착했을 때 2BSD 라인이되도록 PDP의 그냥 사라지지 않았다 여전히 느릿 느릿한 함께 .)

    Bourne 쉘은 1983 년까지 Unix 세계 어디에나 있다고 말할 수 있습니다. 이는 컴퓨팅 산업에서 "영원히"에 대한 근사치입니다. MS-DOS는 올해 계층 파일 시스템 얻었다 (! 오 ~, cuuute 방법) 및 제 24 비트 매킨토시 , 문자 그대로 그레이 스케일하지 -의 9 "의 B & W 화면이 검은 색흰색 - 초기 내년 때까지 오지 않을 것입니다.

  2. 톰슨 쉘은 오늘날의 표준에 의해 매우 원시적 이었습니다 . 오늘날 우리가 기대하는 스크립트 프로그래밍 환경이 아닌 대화식 명령 셸이었습니다. 파이프와 I / O 재 지정과 같은 것을 가지고 있는데, 우리는 "유닉스 쉘"의 원형으로 생각합니다. 그래서 우리는 MS-DOS 명령 쉘 을 유닉스에서 가져 오는 것으로 생각합니다.

    Bourne 쉘 은 PWB 쉘을 대체 하여 프로그램 가능성 ( if, switchwhile) 및 초기 환경 변수 와 같은 Thompson 쉘에 중요한 사항을 추가했습니다 . PWB 쉘은 모든 유닉스 버전의 일부가 아니기 때문에 Thompson 쉘보다 덜 잘 기억됩니다.

  3. POSIX와 Bourne 쉘 호환성에 대해 구체적으로 언급 하지 않은 사람 의미 할 수있는 모든 범위가 있습니다.

    극단적으로, 그들은 1979 Bourne 쉘을 기준으로 사용할 수 있습니다. 에 " sh이 의미에서 호환 스크립트는"진정한 Bourne 쉘 또는 그 후속와 클론의 완벽하게 실행 할 것으로 예상된다 의미 ash, bash, ksh, zsh, 등

    다른 극단의 누군가는 POSIX에 의해 지정된 쉘을 기준으로 가정합니다. 우리는 오늘날 많은 표준 POSIX 쉘 기능을 "표준"으로 가져 와서 Bourne 쉘에 실제로 존재하지 않았다는 사실을 종종 잊어 버립니다. 내장 된 산술, 작업 제어, 명령 내역, 별명, 명령 행 편집, $()명령 형식 대체 등

  4. Korn 쉘은 1980 년대 초로 거슬러 올라가고 있지만 AT & T는 1988 년 System V Release 4 까지 Unix로 선적하지 않았습니다 . 많은 상용 Unix가 SVR4를 기반으로하기 때문에, 이는 ksh거의 모든 상용 Unix를 1980 년대 후반

    ( SVR3 및 이전 버전을 기반으로 한 몇 가지 이상한 유닉스 맛 은 SVR4가 출시 된 후 시장에 출시되었지만 혁명 이 왔을 때 처음으로 벽에 맞았습니다 .)

    1988 년은 Korn 쉘 기반 "POSIX 쉘"을 사용하여 POSIX 표준 이 처음 나온 해입니다. 1993 년에 Korn 쉘의 개선 된 버전이 나왔습니다. POSIX 때문에 효과적으로 자리에 원래 못을 박았다 ksh: 두 가지 버전으로 갈래를 ksh88하고 ksh93자신의 분할에 관련된 세의 이름을 따서 명명.

    ksh88차이점은 적지 만 일부 버전의 ksh88셸이 POSIX와 호환되도록 패치 되었으므로 POSIX와 완전히 호환되지는 않습니다 . (이것은 David G. Korn 박사와 Slashdot에 대한 흥미로운 인터뷰에서 나온 것 입니다. 예, 껍질을 쓴 사람입니다.)

    ksh93이다 는 POSIX 쉘의 완벽한 호환 상위 . 기본 소스 리포지토리가 AT & T 에서 GitHub 로 이동 한 이후 개발 ksh93산발적으로 진행되었습니다 . (프로젝트의 기본 이름은 1993 이후 릴리스 버전을 나타 내기 위해 접미사가 추가 된 상태 로 남아 있습니다.)ksh93

    Korn 쉘을 POSIX 쉘과 별개로 포함하는 시스템은 대개 /bin/ksh다른 곳에서는 숨기고 있지만 로 사용할 수 있습니다.

    ksh이름 또는 Korn 쉘에 대해 이야기 할 때 ksh93이전 버전과 호환되는 Bourne 및 POSIX 쉘 서브 세트와 구별되는 기능 에 대해 이야기 합니다. 당신은 ksh88오늘 순수한 곳을 거의 뛰어 다니지 않습니다 .

  5. AT & T는 2000 년 3 월까지 Korn 쉘 소스 코드를 독점적으로 유지했습니다 . 이 시점에서 리눅스와 GNU Bash의 연관성은 매우 강력했습니다. 배쉬와 ksh93 각각은 다른 것에 비해 장점 이 있지만,이 시점에서 관성은 리눅스와 배쉬와 밀접한 관계를 유지한다.

    초기 리눅스 업체들이 가장 일반적으로 이상 GNU 배쉬 선택하는 이유에 관해서는 pdksh, 이었다 리눅스가 시작되었을 때 사용할 수를, 나는 유저 랜드의 나머지 너무 많은도에서 왔기 때문에 그것의 추측에는 요 GNU 프로젝트 . Bash pdksh개발자는 Korn 쉘 기능을 복사하는 데 제한을 두지 않기 때문에 Bash는.

    pdkshAT & T가 소스 코드를 실제 Korn 쉘에 릴리스 한 시점에 대한 작업은 중단되었습니다. 그러나 여전히 유지 관리되는 두 가지 주요 포크가 있습니다 : OpenBSD pdkshMirBSD Korn Shellmksh .

    mkshCygwin을 위해 현재 패키지 된 유일한 Korn 쉘 구현 이라는 것이 흥미 롭습니다 .

  6. GNU Bash는 여러 방법으로 POSIX를 뛰어 넘지 만보다 순수한 POSIX 모드에서 실행하도록 요청할 수 있습니다 .

  7. csh/ tcsh는 보통 1990 년대 초반까지 BSD 유닉스에서 기본 대화식 쉘이었습니다.

    BSD 변형이기 때문에, Mac OS X의 초기 버전은 Mac OS X 10.2 "Jaguar"를 통해 이런 식으로 진행되었습니다 . OS X 10.3 "Panther"tcsh 에서 OS X 은 기본 쉘 을 Bash 로 전환했습니다 . 이 변경 사항은 10.2 이하에서 업그레이드 된 시스템에는 영향을 미치지 않았습니다. 변환 된 시스템의 기존 사용자는 자신의 tcsh셸을 유지했습니다 .

    FreeBSD 는 여전히 tcsh기본 쉘로 사용한다고 주장 하지만, 여기에있는 FreeBSD 10 VM에서 기본 쉘은 POSIX 호환 Almquist 쉘 변형 중 하나 인 것으로 보입니다 . 이것은 NetBSD에서도 마찬가지입니다.

    OpenBSD는 pdksh대신 포크를 기본 쉘로 사용합니다.

    리눅스와 OS X의 인기가 높아짐에 따라 일부 사람들은 FreeBSD가 Bash로 전환하기를 원하지만 철학적 인 이유로 곧 그렇게하지 않을 것 입니다. 이다 로 전환하기 쉬운 이 당신을 귀찮게하는 경우.

  8. /bin/sh요즘 진정한 바닐라 본 쉘을 갖춘 시스템을 찾는 것은 드 rare니다 . 호환성 테스트를 위해 충분히 가까운 것을 찾아야합니다.

    나는 현대 컴퓨터의 정품 1979 빈티지 Bourne 쉘을 실행 한 방향으로 만 알고 있어요 : 사용 고대 유닉스 V7의 와 디스크 이미지를 SIMH PDP-11 시뮬레이터 로부터 컴퓨터 역사 시뮬레이션 프로젝트 . SIMH는 유닉스 컴퓨터 뿐만 아니라 거의 모든 최신 컴퓨터 에서 실행됩니다 . SIMH는 AndroidiOS 에서도 실행 됩니다 .

    오픈 솔라리스 , 썬은 -열 공급 처음 Bourne 쉘의 SVR4 버전. 그 전에 V7 이후 버전의 Bourne 쉘의 소스 코드는 Unix 소스 코드 라이센스가있는 사용자 만 사용할 수있었습니다.

    이 코드는 이제 몇 가지 다른 소스에서 쓸모없는 OpenSolaris 프로젝트의 나머지 부분과 별도로 사용할 수 있습니다.

    가장 직접적인 소스는 Heirloom Bourne 쉘 프로젝트 입니다. 이것은 OpenSolaris의 최초 2005 릴리스 직후에 제공되었습니다. 다음 몇 개월 동안 일부 이식성과 버그 수정 작업이 완료되었지만 프로젝트 개발이 중단되었습니다.

    Jörg Schilling은 Schily Tools 패키지 osh에서와 같이이 코드의 버전을 유지 관리하는 데 더 나은 작업을 수행했습니다 . 이에 대한 자세한 내용은 위를 참조하십시오.

    2005 소스 코드 릴리스에서 파생 된 이러한 쉘에는 멀티 바이트 문자 세트 지원, 작업 제어, 쉘 기능 및 원래 1979 Bourne 쉘에없는 기타 기능이 포함되어 있습니다.

    원래 Bourne 셸에 있는지 여부를 확인하는 한 가지 방법은 톰슨 셸에서 쉽게 전환 할 수 있도록 문서화되지 않은 기능을 지원하는지 확인하는 것 ^입니다 |. 다시 말해, 이와 같은 명령 ls ^ more은 Korn 또는 POSIX 유형 쉘에서 오류를 발생 시키지만 ls | more실제 Bourne 쉘에서 작동합니다 .

  9. 간혹 fish, scsh또는 rc/es지지자를 만났지만 C 셸 팬보다 훨씬 드 rare니다.

    rc쉘의 가족은 일반적으로 유닉스 / 리눅스 시스템에서 사용되지 않지만 가족은 위의 그림에있는 장소를 취득하는 방법이다, 역사적으로 중요하다. Bell Labs의 운영 체제 설계에 대한 지속적인 연구의 일환으로 작성된 10th Edition Unix 의 후속 버전Bell Labs 운영 체제 rcPlan 9 표준 쉘입니다 . 프로그래밍 수준에서 Bourne 및 C 쉘과 호환되지 않습니다. 아마도 거기에 교훈이있을 것입니다.

    가장 활발한 변형은 Byby Rakitzis 의 Unix 클론을 기반으로하는 Toby Goodwin에 의해 유지되는 변형 인 rc것으로 보입니다.rc


UNOS "command", "bsh"및 최근 Bourne Shell과 같은 더 많은 관계를 알고 싶다면 메모를 보내주십시오. 힌트 : UNOS 명령에는 인수가있는 한 줄 쉘 스크립트 역할을하는 "do"명령이 내장되어 있습니다. 이 아이디어는 Bourne Shell에 "dosh"로 전송되었으며 ksh 또는 bash에서 얻을 수없는 매개 변수화 가능한 별명을 허용합니다.
schily

pdksh 자체가 Forsyth 쉘을 기반으로한다는 점에 주목할 필요가 있습니다. 오늘날 대부분 잊혀졌지만 pdksh 유산에서 역사적으로 중요한 의미를 가지고 있지만 일부 버전의 미닉스의 껍질이었고 msdos로 이식되었습니다.
Stéphane Chazelas

25

"sh compatible"는 모든 호환 시스템에 존재해야하는 기본 쉘인 POSIX를sh 나타냅니다 . sh 호환 스크립트는 모든 POSIX 호환 시스템에서 작동해야합니다.

그렇게 말할 필요가있는 이유는 일반적으로 /bin/sh에 대한 심볼릭 링크 이기 때문에 /bin/bash일부 Bashism이와 sh함께 사용하도록 선언하는 스크립트로 빠져 들었 습니다 #!/bin/sh. 이 스크립트 는 일부 상용 Unices와 Debian파생 상품을 포함하여 bash로 사용하지 않는 시스템에서는 작동하지 않습니다 ./bin/sh

특히 dashDebian Almquish Shell을 sh최근에 기본값 으로 사용하는 경향이 있습니다 . 작고 빠르기 때문입니다. 이러한 추세는 대본에 포함 된 많은 Bashism을 강조했다 sh. "sh 호환 가능"으로 설명하는 것은 POSIX 지정 언어로 완전히 유지함으로써 이러한 시스템과 함께 작동하도록 의도 된 것임을 나타냅니다. 모든 쉘은 해당 기능의 상위 세트를 구현하므로 모든 곳에서 작동하도록 보장되지만 확장 기능은 보장되지 않습니다 서로 호환됩니다.

다른 쉘은 자체 개발 이력이 있으며 시간이 지남에 따라 사용자를위한 대화식 사용 또는 연관 배열과 같은 스크립팅 확장을 지원하는 기능을 추가하여 다른 방향으로 전환되었습니다. "sh-incompatible"스크립트는 Bash의 [[조건부 와 같은 이러한 비표준 확장 기능 중 일부를 사용 합니다.

비 POSIX는의 기능 bashtcshzsh다른 현재 쉘의 모든 유용 하고 원하는하거나해야 할 경우가 많이있다. 실행중인 시스템 /bin/sh의 기본 sh구현에 있는 기능에 의존 할 수 없기 때문에 자체 작업을 선언하는 스크립트에서는 사용해서는 안됩니다 .

예를 들어 연관 배열을 사용해야하는 스크립트는 다음이 bash아니라 다음을 실행해야합니다 sh.

#!/bin/bash
declare -A array

어디에서나 작동 bash합니다. 확장 기능이 필요하지 않고 이식성이 뛰어난 스크립트 sh는 기본 셸 명령 언어를 사용 하고 고수 한다고 선언해야 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.