
for
zsh에서 작업하려고 하는 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.sh
or 와 같은 것을 사용 /path/to/scratch.sh
하여 디렉토리에 넣고 .PATH
scratch.sh
다른 명령을 사용하여 실행하면 수행되는 작업을 제어합니다(shebang 재정의). 를 사용하면 bash scratch.sh
에서 실행됩니다 bash
. 를 사용하면 zsh scratch.sh
에서 실행됩니다 zsh
. 을 사용하면 시스템에 있는 sh
모든 항목에서 실행됩니다 ( 특정 경우).sh
dash
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
실행 중에 에뮬레이션 모드가 자동으로 켜지도록 합니다.