bash 스크립트 대신 zsh를 사용하는 것이 좋습니다? [닫은]


25

충분한 사람들이 zsh설치하여 스크립트를 실행 한다고 가정 할 수 있습니까?

#!/usr/bin/env zsh

shebang으로?

아니면 너무 많은 시스템에서 스크립트를 실행할 수 없게됩니까?

설명 : 최종 사용자가 실행하기를 원하는 프로그램 / 스크립트에 관심이 있습니다 (Ubuntu, Debian, SUSE, Arch & c 등).


4
이상한 질문입니다. 당신의 목표는 누구입니까? 특정 서클 (Ruby-on-Rails 웹 개발자) zsh은 인기가있을 수 있지만 다른 서클 ( 뱅킹 부문)에서는 거의 들리지 않습니다. 이에 대한 적절한 조언이 필요하면 더 많은 정보를 제공해야한다고 생각합니다.
rahmu

일반적인 리눅스 최종 사용자 세계.
Profpatsch

2
WRT "일반 Linux 최종 사용자 세계", zsh는 비표준입니다. 기본적으로 (대부분 또는 모든 배포판에) 설치되거나 어떤 것도 필요하지 않기 때문에 대부분의 사람들은이를 가지고 있지 않습니다.
금발 미녀

3
내가하지 않습니다 zsh에 설치되어 있는 내 시스템, 나는 하나의 스크립트를 설치하지 않을 것입니다. bash는 일반적으로 사용 가능하지만 bashism을 피해야합니다.
frostschutz

답변:


29

휴대 성을 위해 zsh적어도 Cygwin을 통해 Unix 또는 Unix와 유사하거나 Windows에서도 컴파일 할 수 있지만 대부분의 Open Source Unix와 유사하고 여러 상용 제품 용으로 패키지되어 있지만 일반적으로 기본 설치에 포함되지 않습니다.

bash다른 쪽 끝은 bash내장되지 않은 Linux 기반 시스템의 대다수와 마찬가지로 GNU 시스템 ( GNU 프로젝트의 쉘처럼)에 설치되며 때로는 Apple OS / X와 같은 GNU 이외의 시스템에도 설치됩니다. 상용 유닉스 측에서 Korn 쉘합니다 (AT & T 변이체하지만 더 ksh88하나) 표준이며, 모두 bashzsh선택적인 패키지이다. BSDs에에서 선호하는 대화 형 쉘은 종종 tcsh동안 shAlmquist 쉘 또는 중 하나를 기반으로 pdksh하고 bashzsh뿐만 아니라 옵션 패키지로 설치해야합니다.

zshApple OS / X에 기본적으로 설치됩니다. 심지어 /bin/sh거기에 있었어요. SysRescCD, Grml, Gobolinux 및 아마도 다른 것들과 같은 몇 가지 Linux 배포판에서 기본적으로 찾을 수 있지만 주요한 것으로는 생각하지 않습니다.

대한 마찬가지로 bash, 설치된 버전의 문제가 그리고 그 결과로 사용할 수 있습니다. 예를 들어, 그것은으로 시스템을 찾을 드문 일이 아니에요 bash3zsh3. 또한 지금 작성하는 스크립트가 이전 버전과의 호환성을 유지하려는 것처럼 zsh5작동 한다고 보장 할 수 없습니다 .zsh6bash

스크립트를 들어, 내보기는 다음과 같습니다 사용 POSIX 쉘 구문 모든 유닉스라는 적어도 하나의 쉘이로 sh(반드시에 /bin그 구문을 해석 할 수있다). 그렇다면 이식성에 대해 크게 걱정할 필요가 없습니다. 그리고 그 구문이 충분하지 않다면 아마도 쉘 이상이 필요할 것입니다.

그런 다음 옵션은 다음과 같습니다.

  • 유비쿼터스 인 펄
  • 종속성을 지정하는 모든 대상 시스템에 대한 패키지를 작성하거나이를 지정하여 인터프리터 및 해당 버전 (python 2.6 이상, zsh 4 이상, bash 4.2 이상 ...)을 스크립트의 종속성으로 지정하십시오. 스크립트와 함께 제공되거나 스크립트 상단에 주석으로 포함 된 README 파일 또는 스크립트 시작 부분에 Bourne 구문에서 몇 줄을 추가하여 요청 된 인터프리터의 가용성을 확인하고 명시적인 오류와 함께 구제 그렇지 않으면 이 스크립트는 zsh 4.0 이상이 필요합니다 .
  • 인터프리터를 스크립트와 함께 제공하면 (라이센스 관련 사항에 유의) 대상 OS마다 하나의 패키지가 필요합니다. 일부 인터프리터는 스크립트와 해당 인터프리터를 단일 실행 파일로 묶는 방법을 제공하여 더 쉽게 만들 수 있습니다.
  • 컴파일 된 언어로 작성하십시오. 다시 한 번 대상 시스템 당 하나의 패키지입니다.

"아니오"라고 말하는 "zsh-man", 나는 당신을 자랑스럽게 생각합니다! ^^ 이식성 ftw! (모든주의 사항과 함께 ...). +1.
Olivier Dulac

9

아니 당신은 할 수 없습니다. 사용 가능한 것은 /bin/sh본질적으로 원래 Bourne 쉘입니다. 거의 모든 ( "거의"참고!) Linux 설치에는 bash가 있지만 * BSD 시스템에서는 거의 없습니다 (BSD 추정에는 bash와 같은 GPL 코드에 대한 심각한 오해가 있습니다). Mac에서 표준 쉘이 무엇인지 모르지만 GPL에 대한 오해가 있습니다. Solaris와 동일합니다.

zsh는 틈새 셸이며 Fedora의 기본 설치에 없습니다 (그리고 주요 배포판의 기본값이라고 생각하지 않습니다).


6
확실히 원래 Bourne Shell이 ​​아니라 Posix 호환 시스템의 Posix 쉘 (많은 시스템에서 / bin / sh이지만 반드시 그런 것은 아님) (Solaris <= 버전 10의 경우 / usr / xpg4 / bin / sh)
감시자

"기본"설치는 실제로 중요하지 않습니다. 중요한 것은 그것이 전혀 설치되어 있는지입니다.
Profpatsch

@Profpatsch, 기본 설치는 매우 관련이 있습니다 (아마도 배포판은 사람들이 실제로 사용하는 것을 결정했습니다).
vonbrand

2
@StephaneChazelas, "틈새"는 "사용자가 거의 사용하지 않음"/ "설치가 거의 없습니다"와 같습니다. 얇게 썬 빵 이후 가장 좋은 껍질 일 수는 있지만 작은 조각 만 사용하면 어디서나 설치 될 것이라고 셀 수 없습니다.
vonbrand

1
참고 리눅스의 대다수 요즘 내장되어 배포가 있음을 고려하는 경우 (프린터, 라우터, 텔레비전, 전구를 ... 안드로이드 생각)하는 것이, 리눅스 기반 시스템의 대다수는 않습니다 하지bash이러한 시스템은 아마 주요 없습니다 불구하고 ( OP가 그의 질문에 대해 염두에 두
었음

2

실제로 사용중인 zsh 추가 기능과 위치 에 달려 있다고 생각합니다 . 다른 사용자와 시스템에 스크립트를 배포하려는 경우 bash 또는 sh 를 사용하는 것이 좋습니다 .

스크립트가 조직 전체에서 실행되도록 설계되어 있고 컴퓨터에서 zsh를 사용 하는 규칙이 있고 (예 : 동일한 기본 AMI) 작업에 고급 파일 선택기 또는 http : /의 기타 항목과 같은 확장의 이점이있는 경우 /www.rayninfo.co.uk/tips/zshtips.html 계속 말씀 드리겠습니다 !


1

언급 한대로 bash많은 배포판의 기본 설치에서 일반적으로 사용할 수 있습니다. 에 의존하여 스크립트가 최대 사용자 기반에 도달하지 않습니다 zsh.

스크립트를 설계하기 전에 대답해야 할 중요한 질문은 " 스크립트가 실행되는 쉘이 중요한 이유는 무엇입니까? "입니다.

다른 쉘은 다른 구문을 사용하거나 다른 쉘에서 지원하지 않는 추가 쉘 기능을 제공합니다. "일반 Linux 최종 사용자 환경"에 대한 스크립트를 작성하려면 스크립트가 특정 쉘 환경에 의존하는 구문 또는 쉘 기능을 사용하는지 판별하십시오.

예를 들어, bashdash, Bourne 쉘 또는 /bin/sh사용자 시스템에서 가리키는 것이 지원하지 않는 특정 확장을 지원 합니다.

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

echo {1..10}/bin/sh비해 실행 을 시도 /bin/bash하면 매우 다른 출력을 얻을 수 있습니다.

zsh대부분의 bash구문 을 지원하는 동안 bash셸에서 지원하지 않는 추가 확장 및 구문을 제공 하는 것도 마찬가지 입니다. 구체적인 예는 비교 한이 표를 참조하십시오 .

bash호출 할 때 작동하는 스크립트를 준수 하여 잠재적 인 사용자 기반을 확장 할 수 있습니다 #!/bin/sh -u. 그러나 이것은 또 다른 중요한 질문으로 이어진다 : " 더 큰 휴대 성과 교환하기 위해 무엇을 희생하고 있는가? "

보안 문제, 기능, 효율성 또는 스크립트에 우선 순위라고 생각하는 것과 관련된 차이점이 희생의 가치가 있는지 여부를 결정하십시오. 더 많은 환경에서 작동하기 때문에 알려진 보안 취약점이있는 스크립트를 광범위하게 사용하고 싶지 않을 수 있습니다.

명령 셸을 비교할bash 때 이러한 스크립트를 지원하기 위한 많은 스크립트가 기준으로 사용됩니다 . 쉘 환경 전용 스크립트 나 다른 구문 에 의존하는 것보다 더 많은 사람들이 스크립트를 실행할 수 있습니다.zsh

또한 궁극적으로 사용자가 스크립트를 실행하는 방법을 제어 할 수는 없습니다 ( 다른 쉘에서 스크립트디버깅하는 데 유용함 ).

쉘을 사용하여 쉘 스크립트를 읽으면 (“sh scriptname”) 직접 실행하는 대신 (“./scriptname”) 쉘 스크립트 시작시 모든 주석을 주석으로 처리합니다. 특히, 스크립트를 실행할 때 사용할 인터프리터 ( "#! / bin / sh -u")를 지정하는 주석은 해당 인터프리터 옆에 나열된 모든 옵션과 마찬가지로 무시됩니다.

따라서 이것에 대해 할 수있는 최선의 방법은 스크립트가 어떻게 작동하는지에 대한 큰 희생이없는 한 스크립트를 이식 가능하게 만드는 것입니다.

Bash 코딩 규칙-스택 오버플로를 볼 수도 있습니다 .


1
"무엇을 희생하고 있는지"... autoconf를보십시오. 모든 쉘이 (작은) 기능 세트를 지원하기 때문에 "Original Bourne Shell"에서와 같이 / bin / sh를 대상으로했습니다. 그리고 그들은 큰 고통을 겪었습니다.
위르겐 A. 에르하르트

1

거의 보장 할 수있는 유일한 방법은입니다 /bin/sh. 실제로 정적 링크 된 쉘이거나 다른 쉘에 대한 링크 일 수 있습니다. 다른 쉘은 일반적으로 sh라고 부르며 호환 모드에서 실행됩니다.

첫 문장에서 거의 주목하십시오 .

내가 작업 한 시스템과 같은 모든 유닉스는 그것을 가지고 있었다. 그들 중 많은 사람들은 또한 bash가 설치되어 있습니다 (그러나 전부 는 아닙니다. 예를 들어 bash는 기본적으로 일부 BSD에 설치되어 있지 않습니다. 일부 Linux 배포판 에는 데비안 Almquist 쉘인 DASH 가 포함되어 있습니다.

보증 할 수있는 것은 설치 지침입니다. README 파일에 zsh가 필요하다는 내용의 행을 추가 할 수 있습니다. 패키지를 빌드하면 zsh를 종속성으로 표시 할 수 있습니다. autoconf / automake 도구를 사용하여 확인할 수 있습니다. 설치 스크립트에서 zsh가 있는지 확인하십시오 (/ bin / sh로 시작하고 계속 발견되면 zsh를 찾으십시오). 오류가 표시되지 않는 경우 (예 : "경고 : ZSH가 설치되지 않았습니다. 설치 지침 파일을 읽으십시오! ".)

몇 가지 옵션을 더 잊어 버렸습니다. 그러나 핵심은 다음과 같습니다.

  • 당신이 그것을 확인할 때까지 당신은 아무것도 보장 할 수 없습니다.
  • 당신은 / bin / sh가 존재한다는 것을 거의 보증하며, 그로 몇 가지 점검을 할 수 있습니다.

POSIX에는 / bin / sh, AFAIU가 필요합니다. 마찬가지로 몇 가지 다른 합리적인 유틸리티가 필요합니다. GNU 자동 고결 요건을 확인하십시오.
vonbrand

@vonbrand. POSIX는 필요하지 않습니다 /bin/sh. sh올바른 환경 (기본 환경 일 필요 는 없음)에서 지정한대로 작동해야합니다. /bin/shPOSIX 쉘이 아닐 수 있습니다. 예를 들어 Solaris 10 및 이전 버전에서는 여전히 Bourne 쉘 sh이었으며 표준 은에 /usr/xpg4/bin있었습니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.