최상의 답변
모두 쉘이며 언급하지 않은 것들이 더 많습니다. 어떤 것을 사용하기로 선택 하느냐는 개인적 선호도의 문제입니다.
첫 번째 셸은 Bourne Shell (또는 sh)이고 오랫동안 Unix의 기본값입니다. 그런 다음 Unix에서 주요 파생물이 나왔고 C Shell (또는 csh)이라는 새 셸이 처음부터 만들어졌습니다. 노후화 된 Bourne Shell에 이어 호환되지만 훨씬 더 강력한 Korn Shell (또는 ksh)이 이어졌습니다. 사용 가능한 셸은 일반적으로 Bourne / Korn Shell 파생 (bash), C Shell 파생 또는 복제 (tcsh) 또는 “기타”(예 : zsh) 범주 중 하나에 속합니다.
당신이 언급 한 것뿐만 아니라 선택하십시오. GNU bash는 Bourne / Korn Shell 캠프에 속하며 오늘날 다양한 Unix 및 Linux 변형의 기본 셸입니다. 만약 당신이 “유닉스 나 리눅스에서 쉘 터미널을 사용했다면, 이것이 바로 이것 일 것입니다. 만약 당신이 정말로 진정으로 Bourne Shell (sh)을 원한다면 저는 그것이 지금 무료로 사용 가능하다고 믿습니다. 그러나 그것은 일반적으로 충분한 기능을 가지고 있지 않은 것으로 피합니다.” Korn Shell은 이전 버전과 호환되며 클론 (mksh) 및 최근 출시 된 원본 (ksh)의 형태로도 무료입니다.
C Shell의 경우 원본 csh의 확장 된 클론 인 tcsh가 있습니다. . csh가 앞으로 나아갈 수있는 방법으로 보이지 않았고 “사용자 수가 많지 않기 때문에 csh 클론이 적습니다. 그러나 많은 BSD 버전의 Unix (예 : FreeBSD 및 기타)는 csh를 기본 쉘로 사용합니다. / p>
sh / ksh 또는 csh와 호환되지 않는 변형이 있지만 틈새 쉘인 경향이 있습니다. 이 공간에서 제가 가장 좋아하는 것은 Scheme Shell (scsh)과 Plan 9 shell rc입니다.하지만 이들은 기본적으로 Unix 나 Linux에 설치되지 않으며 전자는 다소 큽니다. zsh도이 “기타”범주에 속합니다.
제 권장 사항은 세 가지입니다. 먼저 시스템에서 기본 쉘을 사용해보십시오. 거의 확실하게 GNU bash가 있습니다. Bash는 어디에나 있으며 비 호환성없이 Bourne Shell 및 Korn Shell 프로그램을 읽고 실행합니다. 둘째, 진정으로 시도하고 싶은 각 셸 (예 : zsh 또는 tcsh)을 시도하고 잠시 동안 작업하고 필요에 맞는지 확인하십시오. 마지막으로 원하는 것을 사용하십시오.
사용하는 쉘에 스크립트를 작성할 필요가 없습니다 . 대화식으로 C Shell을 사용했지만 프로그래밍을 거부했습니다 (모든 스크립트는 Korn Shell을 사용했습니다). 마지막으로, 어느 날 ksh에 뛰어 들었고 결코 뒤돌아 보지 않았습니다.
내 개인적으로 가장 좋아하는 부분은 이것입니다. 포인트는 mksh (확장자가없는 Korn Shell 클론)-또는 완전한 Korn Shell 호환성을 갖춘 GNU bash-또는 rc , Unix의 후속 버전이 될 것으로 예상되는 새로운 Plan 9 운영 체제의 셸입니다 (이는 구체화되지는 않았지만).
답변
무엇을 위해 더 좋습니까?
기준은 무엇입니까?
개인적으로 bash 를 권장합니다. Linux 및 MacOS X 시스템에서 기본값이고 Cygwin 을 통해 다른 모든 형태의 Unix 및 MS Windows에서 쉽게 사용할 수 있으며 Linux 용 Microsoft ™ Windows 서비스” (Ubuntu bash 지원 레이어 / 하위 시스템).
기본적으로 수년에 걸쳐 다양한 시스템을 운영 할 경우 저항이 가장 적은 경로입니다.… 확장 된 웹 / 앱 서버 팜에서 일반적입니다). Korn 쉘에 가까워서 의미가 다른 코너 케이스를 찾는 사람은 거의 없습니다. (대부분의 사용자는 ash 및 대시 대시 와 같은 최소한의 Bourne 셸 복제 간의 차이를 인식하지 못할 것입니다. span> 및 bash 가 추가하는 기능은 ksh 의 차이점을 훨씬 덜 구분할 수 있습니다. span> 및 bash .
zsh 가 아마도 가장 강력합니다. 자신의 셸을 사용하고 사용자 지정하는 데 진정으로 열정적 인 사람에게 가장 적합합니다. 모든 개선 사항과 사용자 지정 기능이 포함 된 셸 사용의 단점은 사용자가 다음과 같은 경우 다른 셸을 사용하는 것이 실망 스러울 수 있다는 것입니다. zsh 가 (아직) 설치되지 않은 시스템의 디버깅 문제는 현대 환경의 운영 / 시스템 관리자가 상당히 자주 수행하는 작업입니다.동료와 함께 작업하거나 멘토링하고 셸 프롬프트에서 무언가를 보여 주거나 GNU 화면 또는 tmux 세션.
Korn 쉘, ksh 는 bash 는 몇 가지 사소한 세부 정보로 제공되지만 어디서나 가져오고 설치하고 구성해야 할 가치가있을만큼 충분하지 않습니다.
ksh 는 bash 가 추가하기 몇 년 전에 “연관 배열”(해시 / 사전)을 지원했습니다. (몇 년 전에 만 bash 에 추가되었지만, 기본적으로 MacOS X와 함께 제공되는 버전에는 여전히 포함되어 있지 않습니다.) 따라서 일반적으로 쉘 스크립트에서 연관 배열을 사용하지 않는 것이 가장 좋습니다. 기능이 필요하다고 생각되면 일반적으로 Python, Ruby, Perl, TCL / wish 또는 기타 여러 범용 스크립팅 언어로 전환하는 것이 가장 좋습니다. . 한 기능에 대해서만 다른 셸 (운영 오버 헤드 측면에서)로 전환하여 얻을 수있는 것이 많지 않습니다.
ksh Coprocesses .
유일한 다른 주목할만한 차이점은 반드시 설명해야하는 차이점입니다. 다음 쉘 명령을 고려하십시오.
unset foo; echo bar | read foo; echo "$foo"
Bourne 호환 쉘에서 완벽하게 유효합니다. 그러나 다양한 셸에서 다르게 작동합니다. 문자열 “bar”(및 새 줄)를 방출하거나 빈 줄만 방출합니다.
bash 가 수행합니다. 후자는 ksh 및 zsh 가 전자 방식으로 수행됩니다. “foo”쉘 변수는 현재 쉘에 설정됩니다. 제 생각에는 이것이 선호하는 의미입니다.
하지만 이것은 코너 케이스입니다. 내가 아는 한 Unix 셸에 대한 Posix 사양은 다루지 않습니다. 따라서 동작이 구현에 따라 다르다는 사실은 버그가 아닙니다. 이것은 단지 셸의 전문가가 알고 있어야하고 테스트하거나 해결해야하는 것입니다.
이 동작의 이유는 셸의 “파이프”연산자가 프로세스 간 통신이기 때문입니다. 기구. 쉘은 상위 프로세스 메모리의 자체 사본을 실행하는 하위 프로세스 인 하위 쉘을 만들어야합니다. 그러나 주어진 구현은 명령을 구문 분석하고 서브 셸의 파이프 기호 앞 (왼쪽) 부분을 실행할 수 있습니다 ( ksh 및 zsh ) 또는 파이프 뒤 (오른쪽) ( bash에서 수행 한대로 매우 이전 버전의 ksh (1983 년 릴리스 이전?) 및 이전 Bourne 셸 및 대부분 재 및 대시 와 같은 복제품 중 하나입니다.
작품 1 개 주변은 다음과 같이 읽기 가 내장 된 파이프 뒤의 모든 명령이 “범위 내에”있는지 확인하기 위해 명령 그룹화를 사용하는 것입니다.
unset foo; echo bar | { read foo; echo "$foo"; }
(부수적으로이 예는 bash span에 존재하는 미묘한 버그를 노출합니다. > 1.4 이전 및 이후 수정되었습니다. 파서는 {} 문자 및 토큰을 처리하는 데 사용되었습니다. () (괄호)와 매우 유사합니다. 그래서 그것은 내 echo“$ foo” 뒤에 세미콜론을 생략하는 것을 허용했습니다. 이것은 기술적으로 사양에서 벗어난 것입니다. 문제는 수백만 명의 사람들이 bash 를 사용하고 닫는 중괄호 앞에 명령을 종료 할 필요가 없다는 가정하에 스크립트를 작성하고 있다는 것입니다. 세미콜론 또는 개행. 따라서 이러한 오래된 셸 스크립트 중 일부는 10 년이 지난 후에도 여전히이 버그를 나타내며이를 발견하고 수정할 수있을만큼 셸을 잘 아는 사람은 소수에 불과합니다.
대화식 사용에 관해서는, bash 는 ksh 보다 분명히 우수하지만 아마도 zsh 는 매우 까다로운 기능 향상 및 사용자 지정을 배우고 사용하려는 모든 사용자를위한 것입니다.
bash 는 프로그래밍 가능한 [Tab] 완성과 GNU readline 라이브러리를 지원하여 키 바인딩, 명령 줄 편집 및 명령 기록에 대한 액세스를 매우 유연하게 제어합니다. ksh 에는 상대적으로 제한된 fc 명령 ( bash 는 또한 “수정 명령”을 지원합니다. 즉, 기록에서 항목을 선택하고 선호하는 텍스트 편집기에서 가져 와서 종료시 편집 된 임시 파일의 내용을 자동으로 실행합니다.
하지만 bash 는이를 지원하고 자체 emacs 또는 vi 기록 액세스 및 편집, 이전 csh ! (뱅) 연산자도 있습니다.
bash 는 vi 편집을 지원합니다. 모드 ( set -o vi )는 정확히 기억하면 ksh span의 기본값이었습니다. > 93. 그러나 bash 는 기본적으로 emacs 모드 ( set -o emacs ). 물론, bash bind 명령을 사용하여 많은 수의 편집 및 기록 조작 기능 또는 명령 줄에 입력 할 텍스트로 확장되는 매크로에 대한 키입니다.
추가적으로 bash 에는 상상할 수 없을 정도로 미묘하고 복잡한 작업을 수행 할 수있는 많은 “마법”환경 변수가 있습니다. 예를 들어 PROMPT\_COMMAND 변수를 설정하여 bash 가 실행될 때마다 사용자 지정 후크를 실행할 수 있습니다. 프롬프트를 표시하려고합니다. 따라서 마법의 .dot\_file 을 확인하고 어떤 디렉토리에 있는지에 따라 실행중인 셸을 다시 사용자 지정하거나 프롬프트 문자열 및 터미널 화면 색상을 재설정 할 수 있습니다. 시간을 기준으로하거나 웹 사이트를 쿼리하여 자동으로 명령을 실행합니다.… 거의 모든 것을 기반으로합니다.
(저는이 후크를 사용하여 작업 디렉토리로 변경하여 Python 가상 환경을 자동으로 활성화했습니다. 예).
tcsh (또는 그 조상 인 csh ) 그러면 약간의 틈새 시장에 있습니다. EDA (전자 설계 자동화) 분야에서 csh 스크립트를 보는 것이 일반적입니다. 그러나 그것은 역사의 우연이며 그 분야에서 일하는 대부분의 사람들은 대화식 사용을 위해 tcsh 를 사용하지 않습니다.
물고기 껍질도 틈새 시장입니다. 나는 그것에 대한 의견을 형성하는 데 충분히 사용하지 않았으며 확실히 충분히 다채 롭습니다. 하지만 진정으로 널리 퍼진 팔로어를 키우기 전에 괭이 질하기가 매우 어려울 것이라고 생각합니다. Apple ™이 Mac ™ 시스템의 기본 셸로 출시하지 않는 한 가까운 장래에 틈새 시장에 남아있을 수 있습니다.
그래서 제가 요점을 정했으면합니다. (합리적인 대안이있는 거의 모든 것 중에서) “최고가…”라고 물을 필요가 없습니다.
Unix 명령 셸의 경우 Bourne 호환 셸 간의 차이점은 다음과 같습니다. 전문가 만이 구분할 수있을 정도로 사소하며, 이들은 절충점이 있고 결국에는 오히려 주관적인 선호로 귀결됩니다. zsh 설정에 열정적 인 동료들과 그저 걱정하는 다른 사람들이 있습니다. 저는 가장 쉽게 이용할 수있는 선택에 적응하는 사이에 있습니다.