bash에서 zsh로 전환하려고하지만 bash 스크립트의 호환성에 대해 걱정하고 있습니다.
모든 bash 스크립트 / 기능이 zsh와 호환됩니까? 따라서 이것이 사실이라면 zsh는 bash를 개선 한 것입니까?
답변
스크립트가 줄로 시작 #!/bin/bash
하면 기본 쉘이 zsh 인 경우에도 bash를 사용하여 계속 실행됩니다.
zsh의 구문이 bash의 구문과 거의 비슷하다는 것을 알았으며 실제로 비 호환성이 있으면주의를 기울이지 않았습니다. 6 년 전에 bash에서 zsh로 완벽하게 전환했습니다.
답변
Zsh는 올바른 에뮬레이션 모드 ( emulate sh
또는 emulate ksh
)로 설정하면 대부분의 Bourne, POSIX 또는 ksh88 스크립트를 실행할 수 있습니다 . bash 또는 ksh93의 모든 기능을 지원하지는 않습니다. Zsh는 대부분의 bash 기능을 가지고 있지만 많은 경우 다른 구문을 사용합니다.
대화식으로 사용하는 쉘은 가지고있는 스크립트와 관련이 없습니다. 스크립트를 실행하는 쉘은 첫 번째 라인 인 shebang 라인에 표시된 것입니다 . 예를 들어, 스크립트가로 시작하면 #!/bin/bash
bash에 의해 실행됩니다.
당신이 떠들썩한 파티를 사용자 정의했다면, 당신은 당신의 이름을 바꿀 수 없습니다 .bashrc
에를 .zshrc
. 두 쉘 사이의 교차점을 고수하는 한 (예 : 교차점이 ksh88 및 pdksh에 가까운 경우) 별칭 및 함수와 같은 일부 항목을 공유 할 수 있습니다 . 프롬프트 설정, 완료 기능 및 대부분의 옵션과 같은 기타 사항은 완전히 다시 작성해야합니다.
사람들이 소스 코드를 작성 .bashrc
하거나 .zshrc
두 가지 버전을 유지하지 않으려는 경우 대부분의 bash 프로그래밍 기능을 포함하는 bash 및 zsh 기능의 공통 하위 집합을 고수하십시오. 전체 코드를 함수에 넣고 각 함수의 맨 위에 다음 줄을 넣으십시오.
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
일반 sh 구문에 더 가깝게 사용하는 emulate sh
대신 사용할 수 있습니다 .emulate ksh
.profile
함수가 다른 함수를 호출하면 다른 함수는 에뮬레이션 설정을 상속하므로 최종 사용자가 호출 한 함수에만이 줄을 내부 함수에 넣을 필요가 없습니다.
답변
shebang이 #!/bin/bash
있고 스크립트를 시작하면 스크립트 ./script
가 bash에 의해 실행됩니다. 여기서 아무런 문제가 없습니다.
그러나 실행중인 zsh 인스턴스 를 실행 zsh ./script
하거나 소싱하는 경우 . ./script
bash 및 zsh 구문이 일치하지 않는 것이 일반적입니다.
예를 들어, zsh는 기본적으로 매개 변수 확장을 분할하지 않으며, bash에는 도움말이 내장되어 있고 read -p prompt
zsh 에는 없습니다 (구문은 zsh에서 매우 다른 읽기 cmd \? prompt , arrays start on 1 (not 0) in zsh,
명령 only search for external commands in zsh, or there is no (simple) equivalent to
$ {foo ^}`(첫 번째 문자 만) 임) 이것은 (주로) 유사성과 약간의 차이점에 대한 긴 목록입니다 .
어떤 경우에는 zsh가 다른 쉘을 에뮬레이트하도록 지시받을 수 있습니다. 경우에 따라, 휴대용 솔루션을 에뮬레이트하기 위해 별명이나 함수를 사용하지 않고 두 쉘 모두에 이식 가능한 공통 구문이 없습니다.
그러나 zsh에는 대화식 작업을보다 쉽게 수행 할 수있는 많은 확장 기능이 있습니다. 그것은 동시에 전환해야 할 훌륭한 이유와 문제입니다.
-
- 탭을 누르면 명령 구문 옵션을 볼 수있어 매우 좋습니다.
- zsh의 또 다른 주요 이점은 오타를 만들 때 오류 수정입니다. zsh는 단순히 오류를 표시하지 않고 명령을 찾을 수 없으므로 입력하려는 내용을 해석하려고합니다. zsh는이 입력을 유효한 명령으로 승인합니다.
- 또한 zsh에는 다양한 솔루션을 사용할 수 있도록 확장에 대한 수정자가 많이 있습니다. Like : 파일 만 나열 :
ls *(.)
(다른 쉘에서는 어렵습니다). 충분히 깊이 살펴 보더라도 zsh (print -rl -- *(/)
) 에서는 답이 복잡해집니다 . - 수레가있는 수학 (일부 경고 사항 포함)을 수락합니다.
-
사기 zsh :
- Bash는 더 많은 시스템에서 기본 셸입니다.
- 많은 zsh 옵션은 bash 호환 스크립트 작성에 직접 도움이되지 않습니다.
- 동시에 두 개의 껍질을 배우려고 노력하는 것은 큰 문제가 될 수 있습니다.
결국, 그것은 당신의 선택이며, 나는 항상 더 많은 선택을 좋아합니다.