모든 bash 스크립트는 `zsh`와 호환됩니까?

모든 bash 스크립트는 `zsh`와 호환됩니까?

bash에서 zsh로 전환하고 싶지만 bash 스크립트 호환성이 걱정됩니다.

모든 bash 스크립트/함수는 zsh와 호환됩니까? 그렇다면 이것이 사실이라면 zsh는 bash의 향상된 기능일까요?

답변1

스크립트가 이 줄로 시작하면 #!/bin/bash기본 셸이 zsh이더라도 여전히 bash를 사용하여 실행됩니다.

나는 zsh의 구문이 bash의 구문과 매우 유사하다는 것을 알았고 실제로 일부 비호환성이 있는지는 알지 못했습니다. 6년 전에 저는 bash에서 zsh로 원활하게 전환했습니다.

답변2

emulate shZsh는 올바른 에뮬레이션 모드( 또는 emulate ksh) 로 설정하면 대부분의 Bourne, POSIX 또는 ksh88 스크립트를 실행할 수 있습니다. bash 또는 ksh93의 모든 기능을 지원하지는 않습니다. Zsh는 bash의 기능을 대부분 갖추고 있지만 많은 경우 구문이 다릅니다.

대화형으로 사용하는 셸은 보유한 스크립트와 아무 관련이 없습니다. 스크립트를 실행하는 쉘은 첫 번째 줄에 표시된 쉘입니다.셰르본철사. 예를 들어 스크립트가 로 시작하면 #!/bin/bashbash에 의해 실행됩니다.

bash를 사용자 정의한 경우 이름 .bashrc.zshrc.PDKSH). 프롬프트 설정, 완성 기능, 대부분의 옵션과 같은 다른 것들은 완전히 다시 작성해야 했습니다.

.bashrc사람들이 zsh 또는 zsh에서 가져올 수 있는 코드 조각을 작성 .zshrc하고 두 가지 버전을 유지하고 싶지 않다면 bash의 프로그래밍 기능 대부분을 포함하는 bash 및 zsh 기능의 공통 하위 집합을 고수하세요. 전체 코드를 함수 안에 넣고 각 함수의 맨 위에 다음 줄을 넣습니다.

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

emulate sh대신에 를 사용하면 emulate ksh정확히 필요한 sh 구문에 더 가까워질 수 있습니다 .profile.

한 함수가 다른 함수를 호출하면 다른 함수가 가장 설정을 상속하므로 이 줄을 내부 함수에 넣을 필요가 없고 최종 사용자가 호출한 함수에만 넣을 수 있습니다.

답변3

Shebang이 있고 #!/bin/bash스크립트를 시작하면 ./script스크립트는 bash에 의해 실행됩니다. 여기에는 전혀 문제가 없습니다.

그러나 실행 중인 zsh 인스턴스에서 실행 zsh ./script하거나 소싱하는 경우 . ./scriptbash와 zsh의 구문이 일치하지 않는 것이 일반적입니다.

예를 들어, zsh매개변수 확장은 기본적으로 분할되지 않고, bash내장된 도움말이 있으며, zsh에는 아무것도 없습니다 read -p prompt(구문은 read 와 매우 다르며 cmd\?prompt, zsh의 배열은 0 대신 1에서 시작하고, commandzsh에서는 외부 명령만 가능합니다 ). 검색되거나 ${foo^}zsh에 없음(단순)(첫 번째 문자만 대문자로 사용)과 동일하며 이는 (대부분) 긴 목록입니다.유사점과 차이점.

어떤 경우에는 zsh다른 쉘을 에뮬레이트하라는 메시지가 나타날 수도 있습니다. 어떤 경우에는 두 셸 모두에 이식 가능한 공통 구문이 없습니다(이식 가능한 솔루션을 시뮬레이션하는 데 별칭이나 함수가 사용되지 않음).

그러나 zsh대화형 작업을 더 쉽게 만들어주는 많은 확장 기능이 있습니다. 이는 전환해야 할 좋은 이유이자 문제입니다.

  1. zsh의 프로페셔널 버전
  • 탭별 명령 구문 옵션을 확인하면 좋을 것입니다.
  • zsh의 또 다른 주요 이점은 입력 오류가 발생할 때 오류를 수정하는 것입니다. zsh는 오류: 명령을 찾을 수 없음을 표시할 뿐만 아니라 사용자가 입력하려는 내용을 해석하려고 시도합니다. zsh는 이 입력을 유효한 명령으로 받아들입니다.
  • 그 외에도 더 많은 zsh가 있습니다수정자많은 수의 솔루션을 허용합니다. 예: 파일 목록만 나열: ( ls *(.)다른 쉘에서는 어렵습니다).충분히 깊게 살펴봐도 print -rl -- *(/)zsh()에서는 답이 복잡해집니다..
  • 부동 소수점 숫자가 포함된 수학을 허용합니다(일부 주의사항 있음).
  1. 사기꾼 zsh:
  • Bash는 많은 시스템의 기본 셸입니다.
  • 많은 zsh 옵션은 bash 호환 스크립트 작성에 직접적인 도움이 되지 않습니다.
  • 동시에 두 개의 쉘을 배우려고 시도하는 것은 큰 문제가 될 수도 있습니다.

궁극적으로 그것은 당신의 선택이며, 나는 항상 더 많은 옵션을 좋아합니다.

답변4

Bash와 Zsh는 언어 구문 측면에서 고유한 특성을 가진 두 가지 다른 해석기입니다.

대화형 디버깅을 위해 Bash 호환성이 필요한 경우 언제든지 둘 다 사용할 수 있습니다. Bash 기본값을 설정하고 exec zshZ Shell로 실행한 다음 exec bashBash로 돌아갑니다.

Zsh를 기본 셸로 사용하려면 반대로 하면 됩니다.

  • echo $SHELL기본 셸과 현재 인스턴스 셸이 echo $0의심스러울 때 실행하세요 .
  • zsh에서 호출하면 bash ./script원할 수도 있고 원하지 않을 수도 있는 스크립트에 대한 bash 하위 쉘이 생성됩니다.

관련 정보