주류 * NIX 쉘의 근본적인 차이점은 무엇입니까? [닫은]


52

주류 * NIX 쉘의 근본적인 차이점은 무엇이며 어떤 시나리오에서 다른 시나리오를 사용해야합니까? 나는 아마도 그중 일부는 사용자 선호에 달려있을 것이라고 이해하지만 bash 만 사용했으며 다른 쉘이 유용한 곳을 듣고 싶습니다.

또한 하나의 쉘 또는 다른 쉘에서 실행될 때 사용자 작성 쉘 스크립트에 영향을 미치거나 단순히 파일 맨 위에서 쉘을 변경하는 것입니까? 내 본능은 그렇게 쉽지 않다고 말합니다.

답변:


52

대화식으로 사용하기 위해 bashzsh 와 straggler tcsh 와 newcomer fish의 두 가지 주요 경쟁자가 있습니다 .

  • Bash는 GNU 프로젝트의 공식 쉘이며 대부분의 Linux 배포판에서 기본 쉘입니다. 기본 설치의 일부로 괜찮은 대화식 쉘이 제공되지 않는 다른 유니스에서는 bash가 사람들이 선택하는 경향이 있다고 생각합니다. bash왜 어디에 있습니까? (이력 정보가 ​​많음).

  • Zsh에는 거의 모든 bash 기능과 더 많은 (유용한) 기능이 있습니다. 주요 단점은 잘 알려져 있지 않기 때문에 실제 문제는 다른 사람이 설정 한 시스템에 이미 설치되어 있지 않으며 타사 문서가 적다는 것을 의미합니다. 어떤 zsh 기능을 사용하십니까?를 참조하십시오 . , zsh의 어떤 기능이 bash에서 누락되었거나 그 반대입니까? .

  • Tcsh는 한때 (1990 년대 초까지) 이전 csh와 같은 최고의 대화 형 기능을 갖춘 쉘이었습니다. 그것은 대화식 사용에 인기가 있었지만 스크립팅에는 사용 되지 않았습니다 . Zsh는 tcsh를 따라 잡았고 상당히 빠르게 개선되었으며 2000 년대 초에 bash는 (프로그래밍이 완료된 상태) 따라 잡았지만 tcsh는 지난 15 년간 거의 발전하지 못했습니다. 그러므로 지금 tcsh를 배울 이유가 거의 없습니다.

  • 물고기는 이전의 물고기보다 깨끗해 지려고합니다. 그것은 깔끔한 기능 (단순한 구문, 명령 줄의 구문 색상 표시)이 있지만 다른 기능은 없습니다 (작성자가 싫어하는 것). 물고기 공동체는 zsh보다 훨씬 작기 때문에 그 효과는 더욱 심각합니다. fish와 zsh의 차이점은 무엇입니까?를 참조하십시오 . .


스크립팅의 경우 원하는 이식성에 따라 여러 언어를 타겟팅 할 수 있습니다.

  • 유닉스처럼 가장 한 것에는 Bourne 파생 쉘이 있습니다 /bin/sh. POSIX를 준수 /bin/sh하지 않는 곳에 는 여전히 상업적인 유니스가 있습니다 .

  • 거의 모든 현재 실행중인 유닉스는 sh최소한 POSIX.2-1992 이상과 일반적으로 POSIX : 2001 또는 Single Unix v3 이상을 준수 하는 실행 파일을 가지고 있습니다. 이 쉘은 /usr/bin/posix또는 과 같은 다른 디렉토리에있을 수 있습니다 /usr/xpg6/bin. 또한 POSIX 에뮬레이션 계층은이를 지원할만큼 강력한 모든 시스템에 존재하므로 매력적인 대상이됩니다.

  • 대부분의 유닉스 시스템은이 경우 ksh93 (배열, 연관 배열, 확장 globs와 (매우 유용한 POSIX 쉬가 부족 기능을 제공합니다, *(foo), @(foo|bar), ...), 널 globs의을 ( ~(N)foo*...)). Ksh는 처음에는 상용 소프트웨어였으며 (일부 습관이 정립 된 후 2000 년에 무료로 제공됨), 많은 무료 유니스 (Linux, * BSD)는 이러한 유용한 기능이 부족한 훨씬 오래된 무료 클론 ( pdksh ) 만 제공하는 습관을들이 었습니다. . Pdksh는 이제 OpenBSD 외부에서 mksh로 대체 되었지만 mksh조차도 모든 ksh93 기능을 구현하는 데 부족합니다. 오늘날 ksh93이 어디서나 사용 가능한지, 특히 bash가 표준 인 Linux에서는 믿을 수 없습니다.

  • Bash 는 Linux (일부 임베디드 변형 제외)와 다른 유니스에서 항상 사용할 수 있습니다. ksh93의 유용한 기능은 대부분 있지만 때로는 다른 구문을 사용합니다.

  • Zsh 에는 ksh93과 bash의 유용한 기능이 대부분 있습니다. 핵심 구문은 깔끔하지만 Bourne과 호환되지 않습니다. macOS를 제외하고는 설치하지 않은 시스템에서 zsh를 사용할 수 있다고 생각하지 마십시오.

  • 고급 스크립팅을 위해 Perl 또는 Python으로 전환 할 수 있습니다 . 이러한 언어에는 적절한 데이터 구조, 적절한 텍스트 조작 기능, 적절한 프로세스 조합 및 통신 메커니즘 및 사용 가능한 수많은 라이브러리가 있습니다. 대부분의 유닉스 시스템은 OS와 번들로 제공되거나 관리자가 설치합니다 (Perl 및 Python 스크립트가 너무 많아서 각각 하나 이상이없는 드문 시스템이기 때문에).


4
스크립팅의 경우 최소 기능 세트가 있으며 최대 호환성을 위해 posix 불만 사항 인 대시를 대상으로합니다 (bash의 고급 기능이 필요하지 않은 경우). (그리고 그것은 작고 가볍다)
21:10에

위대한 다큐멘터리! 두 노트. 첫째, Solaris 는 "/ bin / sh가 POSIX를 준수하지 않는 상용 유니스"중 하나입니다. 특히, jsh( Java 쉘 이 아닙니다 !)를 사용하며 ${VAR#foo}and과 같은 변수 대체가 없습니다 ${VAR%bar}.
Adam Katz

둘째, tcsh(모두의 도입 보았던 ~ 90 년대 중반 전에 트릭을 알게 UNIX 사용자들 사이 오히려 인기 bashzsh특히 기존의 UNIX + 중) C과 함께 인생을 시작 개발자 csh(알림의 C 에서 csh에 대한 스탠드 C언어 본 스타일의 쉘과의 차이점에 대한 영감을 얻었습니다. POSIX 딥 매직 (anti-csh 인수 외에도) 에 대한 팁으로 자주 사용하는 유해한 것으로 간주되는 Csh 프로그래밍을 참조하십시오 .
Adam Katz

Mac OS X은 "OS / X"가 아닙니다. (: 그리고 zsh는 Bourne과 어떻게 호환되지 않습니까? (단어 분할 변수 확장이 아닌 것을 제외하고)
SilverWolf

@seaturtle 단어 분리가 아닌 변수 확장은 zsh로 실행하려고하면 많은 sh 스크립트를 중단시키는 주요 차이점입니다 (sh / ksh 에뮬레이션 모드에서 zsh를 실행하지 않는 한).
질 'SO- 악마 그만'

27

쉘에는 sh (예 : bash)와 csh (예 : tcsh)의 두 가지 기본 맛이 있습니다. 대화식 사용의 경우 주로 익숙한 것에 달려 있습니다. 나는 몇 년 동안 csh를 사용한 다음 tcsh를 사용해 왔으며 너무 익숙해지기 때문에 전환하기가 어려울 것입니다. bash도 사용했으며 전환해야 할 이유가 없다고 생각합니다. 정기적으로 사용하는 기계에서 하나 또는 다른 것을 사용할 수없는 경우를 제외하고.

프로그래밍의 경우 구문이 다릅니다. 쉘을 변경할 수는 없지만 스크립트 구문도 변경해야합니다. 스크립팅의 경우 sh 또는 bash를 사용하려고합니다. 여기에 설명 된대로 구문은 스크립팅에 훨씬 더 적합합니다 ( 링크에 대한 Riccardo Murri 덕분 입니다. bash 스크립팅에 대한 유용한 안내서 입니다.

쉘을 결정하지 않고 일부 스크립트를 작성하려는 경우 배쉬를 사용하여 배우는 데 필요한 양을 줄입니다.


12

예전에는 AT & T가 UNIX를 발명했을 때 Steve Bourne이 작성한 Bourne Shell이있었습니다. 그것은 꽤 기본적이며 오늘날 우리가 당연하게 여기는 많은 도구가 부족했습니다.

AT & T는 실제로 UNIX 비즈니스에 포함되지 않았기 때문에 현재 Berkelely는 기본 OS를 다소 채택하여 BSD UNIX를 일부 변경했습니다. 많은 변경 사항 중 csh라는 새로운 셸이 있었는데, 작업 제어의 대화식 사용 향상 등을 포함하여 sh보다 많은 기능이 개선되었습니다. 불행히도, 그들은 sh 프로그래밍 구문이 빨아 들여서 C 코딩 스타일에서 복사 된 자신 만의 (어쩌면 나쁘게) 만들어 졌다고 결정했다. (클래식 rant는 http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ 입니다 . ) 이제 두 가지 구문이있었습니다.

나중에 그들은 탭 완성과 다른 것들을 추가하여 CSH를 개선했습니다. 이것은 tcsh가되었으며 CSH를 사용한다면 아마도 이것이 당신이 사용하는 것일 것입니다.

AT & T는 이것이 유닉스 비즈니스에서 완전히 벗어나지 않았다고 결정하고 그것을 연마했습니다. David Korn (좋은 사람)은 Korn 껍질을 만들었습니다. Bourne 쉘 구문을 확장한다는 아이디어를 바탕으로 프로그래머와 대화식 사용 모두에 많은 것들을 추가했습니다. 실제로 몇 가지 버전이 있으며 변형을 나타내는 ksh88 및 ksh93과 같은 것을 거의 볼 수 없습니다.

FSF와 GNU OS가 등장했습니다. 그들은 자신들의 유닉스 호환 OS 인 허드 (Hurd)를 만들고 싶었고 더 나은 쉘을 원했습니다. 그들은 Bourne Again SHell을 위해 bash를 불렀습니다. POSIX 규칙은이시기에 와서, 그들은 만들고 싶어 POSIX 쉘을. 그들은 Bourne 쉘의 구문과 Korn 쉘의 개선 사항을 취하고 tcsh의 대화 형 기능을 훔치고 확장했습니다. Linux에서 사실상 쉘이되었으므로 매우 일반적입니다.

'ultimate'쉘로 작성된 zsh도 있습니다. Linux 세계에서도 매우 일반적입니다. 그것은 bash를 확장했습니다 (그리고 약간의 수분을 교차 시켰습니다, 새로운 것들이 bash로 돌아갔습니다).

쉘을 고르려면 bash 또는 zsh를 고릅니다. bash는 zsh보다 몇 군데 더있을 수 있습니다. zsh가 더 강력하지만 bash는 나에게 좋았습니다. 실제 / bin / sh Bourne 쉘은 역사적인 이유로 만 사용됩니다. bash는 ksh가 제공하는 모든 것을 제공합니다. 구문은 csh 또는 tcsh보다 깨끗하며 둘 중 하나보다 나은 기능을 가지고 있습니다.

스크립트를 변환하는 것은 무엇에서 무엇에 달려 있습니다. Bourne 쉘 스타일 (sh, ksh, bash, zsh)과 csh 스타일 (csh, tcsh) 사이는 어렵습니다. 이전 방식에서 최신 방식 (/ bin / sh => bash, / bin / ksh => zsh)으로 전환하는 것이 다른 방법보다 쉽습니다.


csh-whynot 페이지는 1995 년 9 월에 다시 작성되었습니다 (맨 위의 버전 태그 확인). 잘 모르겠지만, 그 이후로 18 년 동안 많은 것들이 변했을 것으로 예상됩니다.
CVn

8

쉘의 두 가지 주요 분기는 Bourne 쉘 파생 상품 (sh, bash, ksh, ash, yash 및 zsh)과 csh 파생 상품 (tcsh 및 ... uhm ... tcsh)입니다.

나는 bash가 가장 널리 사용되는 것으로 생각하지만 (실제 숫자는 없지만) 대부분의 리눅스에서 기본 쉘 인 것 같습니다.

하나의 Bourne Shell 파생물로 작성된 대부분의 작업은 다른 작업에서 작동합니다. Bourne 쉘로 작성된 대부분의 항목은 csh 또는 tcsh에서 실행되도록 수정해야합니다.

개인적으로 나는 사용중인 시스템에 있었기 때문에 처음 시작할 때 ksh를 사용했습니다. 나는 주로 bash를 사용한다.


1
물고기는 csh에서 영감을 얻은 껍질입니다
21:00에

1

나는 시간이 지남에 따라 수많은 껍질을 사용했습니다. 초 고급은 아니지만 충분한 사용자 정의가 필요한 실용적인 시스템 관리자 및 프로그래밍 기능이 많이 있습니다.

zsh에는 적어도 이전에 사용했던 추가 사용자 정의 옵션이 있다고 생각하지만 몇 년 동안 사용하면 안정성 및 문자 인코딩 문제로 충분했습니다. 배쉬는 견고하고 비슷한 문제가 없으며 어디에나 설치됩니다.

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