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


답변:


55

스크립트가 줄로 시작 #!/bin/bash하면 기본 쉘이 zsh 인 경우에도 bash를 사용하여 계속 실행됩니다.

zsh의 구문이 bash의 구문과 거의 비슷하다는 것을 알았으며 실제로 비 호환성이 있으면주의를 기울이지 않았습니다. 6 년 전에 bash에서 zsh로 완벽하게 전환했습니다.


1
전환에서 가장 어려운 부분은 무엇입니까?
chrisjlee

4
없음 내 개인 스크립트는 bash에 대한 적절한 참조를 추가하고 시작하기에 좋은 .zshrc를 발견했습니다. Zsh와 bash는 충분히 도전적이지 않을 정도로 유사했습니다.
Huygens

4
당신은 당신의 나열 할 수 있습니다 .zshrc:
neaumusic

그러나 ? #!/bin/bash와 같은 스크립트 파일을 실행 하면 행 이 무시됩니다 source ./script.sh.
LCB

3
쉘 경로를 하드 코딩하는 것은 자주 수행 되더라도 좋지 않은 조언입니다. #!/usr/bin/env bash대신 특히 기본 bash가 오래되고 새 버전이 항상 다른 경로에 설치되는 macOS에서 사용해야 합니다.
Konrad Rudolph

29

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

대화식으로 사용하는 쉘은 가지고있는 스크립트와 관련이 없습니다. 스크립트를 실행하는 쉘은 첫 번째 라인 인 shebang 라인에 표시된 것입니다 . 예를 들어, 스크립트가로 시작하면 #!/bin/bashbash에 의해 실행됩니다.

당신이 떠들썩한 파티를 사용자 정의했다면, 당신은 당신의 이름을 바꿀 수 없습니다 .bashrc에를 .zshrc. 두 쉘 사이의 교차점을 고수하는 한 (예 : 교차점이 ksh88 및 pdksh에 가까운 경우) 별칭 및 함수와 같은 일부 항목을 공유 할 수 있습니다 . 프롬프트 설정, 완료 기능 및 대부분의 옵션과 같은 기타 사항은 완전히 다시 작성해야합니다.

사람들이 소스 코드를 작성 .bashrc하거나 .zshrc두 가지 버전을 유지하지 않으려는 경우 대부분의 bash 프로그래밍 기능을 포함하는 bash 및 zsh 기능의 공통 하위 집합을 고수하십시오. 전체 코드를 함수에 넣고 각 함수의 맨 위에 다음 줄을 넣으십시오.

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

일반 sh 구문에 더 가깝게 사용하는 emulate sh대신 사용할 수 있습니다 .emulate ksh.profile

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


1
당신이 사용하는 쉘은 관련이 경우 당신은 귀하의 스크립트를 실행 ./my_script.sh. source my_script.sh그리고 . my_script.sh이 모든 오두막을 무시하고 현재 쉘과 같습니다 실행됩니다.
BallpointBen

3

shebang이 #!/bin/bash있고 스크립트를 시작하면 스크립트 ./script가 bash에 의해 실행됩니다. 여기서 아무런 문제가 없습니다.

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

예를 들어, zsh는 기본적으로 매개 변수 확장을 분할하지 않으며, bash에는 도움말이 내장되어 있고 read -p promptzsh 에는 없습니다 (구문은 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에는 대화식 작업을보다 쉽게 ​​수행 할 수있는 많은 확장 기능이 있습니다. 그것은 동시에 전환해야 할 훌륭한 이유와 문제입니다.

  1. 프로 ZSH

    • 탭을 누르면 명령 구문 옵션을 볼 수있어 매우 좋습니다.
    • zsh의 또 다른 주요 이점은 오타를 만들 때 오류 수정입니다. zsh는 단순히 오류를 표시하지 않고 명령을 찾을 수 없으므로 입력하려는 내용을 해석하려고합니다. zsh는이 입력을 유효한 명령으로 승인합니다.
    • 또한 zsh에는 다양한 솔루션을 사용할 수 있도록 확장에 대한 수정자가 많이 있습니다. Like : 파일 만 나열 : ls *(.)(다른 쉘에서는 어렵습니다). 충분히 깊이 살펴 보더라도 zsh ( print -rl -- *(/)) 에서는 답이 복잡해집니다 .
    • 수레가있는 수학 (일부 경고 사항 포함)을 수락합니다.
  2. 사기 zsh :

    • Bash는 더 많은 시스템에서 기본 셸입니다.
    • 많은 zsh 옵션은 bash 호환 스크립트 작성에 직접 도움이되지 않습니다.
    • 동시에 두 개의 껍질을 배우려고 노력하는 것은 큰 문제가 될 수 있습니다.

결국, 그것은 당신의 선택이며, 나는 항상 더 많은 선택을 좋아합니다.

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