zsh는 shebang bin/sh를 존중하므로 대시를 사용할 수 있습니까?

zsh는 shebang bin/sh를 존중하므로 대시를 사용할 수 있습니까?

forzsh에서 작업하려고 하는 bash의 루프와 관련된 간단한 스크립트가 있습니다 . 나는 Shebang이 POSIX 호환 쉘이 사용되도록 보장하여(내 시스템에서 /bin/sh -> dash*) 문제가 없을 것이라고 가정했습니다.

MWE 스크립트는 ITEMS실제로 패키지를 나열하는 명령의 출력입니다. 예 ITEMS=$(pip freeze):

#!/bin/sh

# ITEMS=$(pip freeze)  # Example of useful command

ITEMS="Item1
Item2
Item3"  # Dummy variable for testing

for ITEM in $ITEMS; do
    echo $ITEM
    echo Complete
done

다음에서 스크립트를 실행하려고 할 때의 출력은 다음과 같습니다 zsh.

$ source scratch.sh
Item1
Item2
Item3
Complete  # Undesired

$ . ./scratch.sh
Item1
Item2
Item3
Complete  # Undesired

$ bash scratch.sh
Item1
Complete
Item2
Complete
Item3
Complete  # Desired

$ sh scratch.sh
Item1
Complete
Item2
Complete
Item3
Complete  # Desired

bash 터미널에서 실행하면 정상적으로 작동합니다. 내가 shebang을 어떻게 해석하는지 오해한 것 같아요 zsh. 누군가 내가 실행할 때 source scratch.sh또는 . ./scratch.sh내가 실행한 것과 동일한 출력을 갖도록 어떻게 사용해야 하는지 설명해 주시겠습니까 sh scratch.sh? for 루프 스크립트를 기본적 zsh으로 호환되도록 수정할 수 있다는 것을 알고 있지만 항상 posix 호환 쉘을 사용하고 bashisms 또는 zshisms에 대해 걱정할 필요가 없도록 bash사용하고 싶습니다 ./bin/sh -> dash

zsh이것이 기본적인 질문이라면 사과드립니다 . , shebang을 검색했지만 posix비슷한 질문을 찾지 못했습니다.

답변1

Shebang은 스크립트를 직접 실행하는 경우에만 영향을 미칩니다.실행 방법을 지정하지 않고; 즉, ./scratch.shor 와 같은 것을 사용 /path/to/scratch.sh하여 디렉토리에 넣고 .PATHscratch.sh

다른 명령을 사용하여 실행하면 수행되는 작업을 제어합니다(shebang 재정의). 를 사용하면 bash scratch.sh에서 실행됩니다 bash. 를 사용하면 zsh scratch.sh에서 실행됩니다 zsh. 을 사용하면 시스템에 있는 sh모든 항목에서 실행됩니다 ( 특정 경우).shdash

source scratch.sh또는 를 사용하면 . scratch.sh다음에서 실행됩니다.현재 쉘, 그게 뭐든지. 이것이 .source명령의 전체 목적입니다. 그리고 여기서도 shebang은 무시됩니다.

답변2

당신은 그렇게 할 수 없습니다. . script또는 source script단순히 include 를 사용하면 script이를 수행하기 위해 별도의 표준 또는 비표준 쉘을 포크하지 않습니다. Shebangs에 관해서는 zsh(당신이원천그보다는 대본실행하다it) 그냥 댓글일 뿐입니다.

zsh하지만 일시적으로 표준 쉘을 에뮬레이트하도록 지시(시도) 할 수 있습니다 . YMMV.

emulate sh -c '. ./scratch.sh'

emulate which_sh -c str은 지정된 에뮬레이션을 일시적으로 적용하여 평가하며 str, 더 중요한 것은 평가 중에 정의된 모든 기능에 "고정"하여 str실행 중에 에뮬레이션 모드가 자동으로 켜지도록 합니다.

관련 정보