최신 UNIX 환경에서 사용되는 대부분의 셸은 POSIX sh 사양을 준수합니다. POSIX sh는 원래 Bourn 쉘에서 파생 된 원래 Korn 쉘 (ksh88)에서 파생되었지만 POSIX sh는 심지어 ksh88 기능의 작은 서브 세트 만 지정합니다. 최소 요구 사항 만 구현하는 셸에는 가장 사소한 스크립트를 제외한 모든 스크립트를 안전하고 합리적인 방식으로 작성하는 데 필요한 많은 기능이 없습니다. 예를 들어, 지역 변수와 배열은 비표준 엑스트라입니다.
따라서 첫 번째 이유는 추가 기능으로 셸을 확장하는 것입니다. 다른 껍질은 다른 것들에 중점을 둡니다. 예를 들어 Zsh는 고급 대화식 기능에 중점을두고 있으며 ksh93 (현재 "원래"korn 쉘)은 강력한 프로그래밍 기능 및 성능에 중점을 둡니다. Dash와 같은 매우 작은 쉘조차도 로컬 변수와 같은 비표준 엑스트라를 최소한 몇 개 추가합니다.
추가 기능은 거의 상호 운용성이 거의 없습니다. ksh88 기능 세트의 대부분은 확장 된 글 로빙 구문과 같이 상호 운용성이 뛰어나지 만 비표준 기능에서는 보장 할 수 없으며 이식 가능한 방식으로 사용하기 위해 무엇을하고 있는지 실제로 알아야합니다.
두 번째 이유는 레거시입니다. / bin / sh에 대해 고대 비표준 구현을 사용하는 독점 유닉스가 여전히 많이 있습니다. 최근까지도 솔라리스는 여전히 Bourne을 디퓨 트로 사용했으며 현대적인 것으로 업그레이드하기보다는 가보 쉘을 유지하기로 결정했습니다. 이러한 시스템은 일반적으로 PATH 변수를 변경하거나 개별 스크립트 내에서 shebang을 변경하여 전환 할 수있는 다른 쉘과 함께 제공됩니다.
요약하자면. 종종 기본적으로 여러 쉘이 있습니다.
- 추가 기능, 특히 비 휴대용 추가 기능을 처리합니다.
- 종종 유지 관리되지 않는 레거시 스크립트를 처리합니다.
- 크기 / 성능. 임베디드 시스템에는 종종 mksh 또는 busybox sh와 같은 작은 쉘이 필요합니다.
- 라이센스 이유. AT & T ksh는 약 2000 년 전까지 독점 소프트웨어였습니다. 이것은 주로 Zsh 및 Bash와 같은 모든 ksh 유사 클론을 일으켰습니다.
- 다른 역사적 이유. 오늘날 인기가 높지는 않지만 scsh 및 es와 같은 언어를 다시 디자인하려는 급격한 시도가있었습니다. 많은 셸의 프로세스 대체 기능은 원래 rc (비트가 다른 구문)에서 왔으며 csh에서 괄호 확장입니다. 각기 다른 쉘은 일반적으로 미묘한 차이가 있거나 미묘한 차이가 있지만 사용 가능한 기능의 조합이 다릅니다.