저는 이제 막 Unix의 기본을 배우기 시작했는데 Unix 계열 시스템에 왜 그렇게 많은 쉘이 있는지 궁금합니다. 책에서Unix 환경의 고급 프로그래밍:
쉘은 사용자 입력을 읽고 명령을 실행하는 명령줄 해석기입니다. 셸에 대한 사용자 입력은 일반적으로 터미널(대화형 셸)에서 나오며 때로는 파일(셸 스크립트라고 함)에서 옵니다.
그런 다음 책에는 Bourne 쉘, Bourne-again 쉘, Cshell 등과 같은 일부 쉘 프로그램이 나열되어 있습니다. 내 질문은 기본적으로 왜 여러 개의 쉘이 필요한가요?
답변1
사람마다 요구사항이 다르기 때문에 주어진 상황에서 자신의 요구사항에 맞는 대안을 갖는 것이 좋습니다. 내 생각에는 셸 자체는 도구일 뿐이므로 다른 도구로 교체할 수 있어야 합니다. 이는 Microsoft Windows 옵션의 성능과 반대되는 Unix/Linux의 성능입니다.
마찬가지로... 왜 그렇게 많은 텍스트 편집기가 있습니까? 이미 브라우저가 있는데 왜 사람들이 새 브라우저를 개발하겠습니까? GNOME, KDE, Xfce, LXDE, E17 등이 있는 이유는 무엇입니까?
답변2
최신 UNIX 환경에서 사용되는 대부분의 쉘은 POSIX sh 사양을 따르도록 설계되었습니다. POSIX sh는 초기 Bourne 쉘에서 파생된 원래 Korn 쉘(ksh88)에서 파생되었지만 POSIX sh는 ksh88 기능의 작은 하위 집합만 지정합니다. 최소한의 것만 구현하는 셸에는 가장 사소한 스크립트를 제외한 모든 스크립트를 안전하고 건전한 방식으로 작성하는 데 필요한 많은 기능이 부족합니다. 예를 들어 지역 변수와 배열은 비표준 추가 항목입니다.
따라서 첫 번째 이유는 추가 기능으로 셸을 확장하는 것입니다. 다른 껍질은 다른 것에 집중하기로 선택합니다. 예를 들어, Zsh는 고급 대화형 기능에 중점을 두고 있는 반면, ksh93(현재 "원래" korn 셸)은 강력한 프로그래밍 기능과 성능에 중점을 두고 있습니다. Dash와 같은 매우 작은 셸에도 로컬 변수와 같은 비표준 추가 기능이 적어도 일부 추가됩니다.
추가 기능이 광범위하게 상호 운용되는 경우는 거의 없습니다. 대부분의 ksh88 기능 세트는 확장된 globbing 구문과 같이 상당히 우수한 상호 운용성을 갖고 있지만 비표준 기능의 경우 보장할 수 없으며 이식 가능한 방식으로 사용하려면 실제로 무엇을 하는지 알아야 합니다.
두 번째 이유는 유산입니다. /bin/sh의 고대 비표준 구현을 사용하는 독점 Unix가 여전히 많이 있습니다. 최근까지 Solaris는 Bourne을 기본 쉘로 사용했으며 최신 쉘로 업그레이드하는 대신 Heirloom 쉘을 유지하기로 선택했습니다. 이러한 시스템에는 PATH 변수를 변경하거나 단일 스크립트 내에서 shebang을 변경하는 등 전환할 수 있는 다양한 셸이 함께 제공되는 경우가 많습니다.
요약하자면. 여러 개의 쉘이 있으며 일반적으로 기본값입니다.
- 추가 기능, 특히 휴대할 수 없는 추가 항목을 처리하는 경우.
- 종종 유지 관리되지 않는 레거시 스크립트를 처리합니다.
- 크기/성능. 임베디드 시스템에는 mksh 또는 busybox sh와 같은 작은 셸이 필요한 경우가 많습니다.
- 라이센스 이유. AT&T ksh는 2000년경까지 독점 소프트웨어였습니다. 이는 주로 Zsh 및 Bash와 같은 모든 ksh 유사 클론을 생성했습니다.
- 다른 역사적 이유. 지금은 덜 인기가 있지만 scsh 및 es와 같이 언어를 재설계하려는 시도가 있었습니다. 많은 쉘의 프로세스 대체 기능은 원래 rc에서 나왔고(구문은 약간 다름) 중괄호 확장은 csh에서 나왔습니다. 쉘마다 사용 가능한 기능의 조합이 다르며, 종종 약간의 미묘하거나 그다지 미묘하지 않은 차이가 있습니다.
답변3
짧은 답변
이상한 라이선스 기록으로 인해 Unix를 개발한 단일 기업은 없습니다. 이는 자원봉사자와 기업 모두가 참여하는 커뮤니티 프로세스입니다. 이러한 엔터티는 항상 모든 도구를 공유하지 않았으므로 별도의 셸이 나타났습니다. 이것이 얼마나 비생산적인지 깨달았을 때에는 사용 중인 모든 포탄을 통합하기에는 너무 늦었습니다. 대신, 우리는 이러한 모든 쉘이 (이론적으로) 보장되도록 작업을 수행했습니다.서로 호환 가능.
대답은 복잡하며 Unix 자체의 역사와 밀접하게 연관되어 있습니다. 이 페이지에 단일 답변이 있을 가능성은 없지만 광범위하게 (잘못) 문서화되어 있습니다. 유닉스의 역사에 대한 인터넷과 책을 검색해보면 보다 자세하고 정확한 답을 찾을 수 있을 것이다.
답변4
주로 역사...
Bourne은 (독점) SysV Unix의 일부로 개발되었지만 BSD는 csh
... 나중에 bash는 Bourne 쉘(및 ksh와 같은 개선된 버전)에 대한 오픈 소스 대체품으로 개발되었습니다. POSIX 표준은 Bourne과 유사한 쉘을 사용합니다. ksh는 호환 가능하며 bash도 호환 가능합니다.
쉘은 원래 Bourne 쉘과 유사하며(명령 완성 등이 부족함) csh
원래 Bourne 쉘보다 대화식으로 사용하기가 더 쉽지만tcsh
대본치고는 너무 끔찍해...
Unix 기반 임베디드 시스템과 같은 일부 환경에서는 명령 완성과 같은 대화형 기능보다 스크립팅 기능, 크기 및 속도가 더 중요하며 다양한 쉘 변형이 사용되는 경향이 있습니다.
이식 가능한 스크립트의 경우 Bourne의 POSIX 호환 변형을 사용해야 하며 확장을 피해야 합니다.