Bash의 루프 와 관련된 간단한 스크립트가 있고 for
이를 zsh에서 사용하려고 합니다. 나는 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
과 shebang을 검색했지만 비슷한 질문을 찾지 못했습니다.
답변1
Shebang은 스크립트를 직접 실행할 때만 효과가 있습니다.실행 방법을 지정하지 않음;즉, ./scratch.sh
또는 같은 것을 사용하여 /path/to/scratch.sh
디렉토리에 넣고 를 PATH
사용하십시오 scratch.sh
.
다른 명령으로 실행하면 실행이 제어됩니다(shebang 재정의). 을 사용 하면 bash scratch.sh
에서 실행되고 , 를 사용하면 시스템에서 실행될 수 있습니다 ( 특정 경우).bash
zsh scratch.sh
zsh
sh
sh
dash
당신이 사용하거나 source scratch.sh
실행 . scratch.sh
되는 경우현재 쉘, 그게 뭐든지. 이것이 .
and 명령의 전체 목적 입니다 source
. 여기서도 shebang은 무시됩니다.
답변2
당신은 그렇게 할 수 없습니다. . script
또는 이를 수행하기 위해 별도의 표준 또는 비표준 쉘을 포크하지 않는 를 source script
포함하면 됩니다 . script
shebangs에 관해서는, 왜냐하면 zsh
(당신이원천대신 스크립트구현하다그것) 그들은 단지 논평을 할 뿐입니다.
그러나 zsh
일시적으로 표준 쉘을 에뮬레이트하도록 지시(시도)할 수 있습니다. YMMV.
emulate sh -c '. ./scratch.sh'
emulate which_sh -c str
str
일시적으로 유효한 지정된 시뮬레이션을 사용하여 평가되며, 더 중요하게는 평가 중에 정의된 모든 기능에 "고착"되어 실행 str
중에 시뮬레이션 모드가 자동으로 켜집니다.