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

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

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

기본적인 질문이라면 죄송합니다. zshshebang posix과 shebang을 검색했지만 비슷한 질문을 찾지 못했습니다.

답변1

Shebang은 스크립트를 직접 실행할 때만 효과가 있습니다.실행 방법을 지정하지 않음;즉, ./scratch.sh또는 같은 것을 사용하여 /path/to/scratch.sh디렉토리에 넣고 를 PATH사용하십시오 scratch.sh.

다른 명령으로 실행하면 실행이 제어됩니다(shebang 재정의). 을 사용 하면 bash scratch.sh에서 실행되고 , 를 사용하면 시스템에서 실행될 수 있습니다 ( 특정 경우).bashzsh scratch.shzshshshdash

당신이 사용하거나 source scratch.sh실행 . scratch.sh되는 경우현재 쉘, 그게 뭐든지. 이것이 .and 명령의 전체 목적 입니다 source. 여기서도 shebang은 무시됩니다.

답변2

당신은 그렇게 할 수 없습니다. . script또는 이를 수행하기 위해 별도의 표준 또는 비표준 쉘을 포크하지 않는 를 source script포함하면 됩니다 . scriptshebangs에 관해서는, 왜냐하면 zsh(당신이원천대신 스크립트구현하다그것) 그들은 단지 논평을 할 뿐입니다.

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

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

emulate which_sh -c strstr일시적으로 유효한 지정된 시뮬레이션을 사용하여 평가되며, 더 중요하게는 평가 중에 정의된 모든 기능에 "고착"되어 실행 str중에 시뮬레이션 모드가 자동으로 켜집니다.

관련 정보