답변:
스크립트가 줄로 시작 #!/bin/bash
하면 기본 쉘이 zsh 인 경우에도 bash를 사용하여 계속 실행됩니다.
zsh의 구문이 bash의 구문과 거의 비슷하다는 것을 알았으며 실제로 비 호환성이 있으면주의를 기울이지 않았습니다. 6 년 전에 bash에서 zsh로 완벽하게 전환했습니다.
.zshrc
:
#!/bin/bash
와 같은 스크립트 파일을 실행 하면 행 이 무시됩니다 source ./script.sh
.
#!/usr/bin/env bash
대신 특히 기본 bash가 오래되고 새 버전이 항상 다른 경로에 설치되는 macOS에서 사용해야 합니다.
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
함수가 다른 함수를 호출하면 다른 함수는 에뮬레이션 설정을 상속하므로 최종 사용자가 호출 한 함수에만이 줄을 내부 함수에 넣을 필요가 없습니다.
./my_script.sh
. source my_script.sh
그리고 . my_script.sh
이 모든 오두막을 무시하고 현재 쉘과 같습니다 실행됩니다.
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에는 대화식 작업을보다 쉽게 수행 할 수있는 많은 확장 기능이 있습니다. 그것은 동시에 전환해야 할 훌륭한 이유와 문제입니다.
ls *(.)
(다른 쉘에서는 어렵습니다). 충분히 깊이 살펴 보더라도 zsh ( print -rl -- *(/)
) 에서는 답이 복잡해집니다 .사기 zsh :
결국, 그것은 당신의 선택이며, 나는 항상 더 많은 선택을 좋아합니다.