zsh 스크립트를 가져온 경우 어떻게 테스트합니까?

zsh 스크립트를 가져온 경우 어떻게 테스트합니까?

이것수락된 답변유사한 문제에는 bash작동하지 않는 것 같습니다 zsh. 실제로 해당 답변에 제공된 동일한 코드를 기본적으로 복사하여 스크립트를 생성하면

#!/usr/bin/zsh -
# test.sh

[[ $_ != $0 ]] && echo "sourced\n" || echo "subshell\n"

출력은 현실과 거의 일치하지 않습니다.

zsh% chmod +x ./test.sh
zsh% env -i /usr/bin/zsh -f
zsh% ./test.sh
sourced

zsh% /usr/bin/zsh ./test.sh
sourced

zsh% /bin/bash ./test.sh
sourced

zsh% source ./test.sh
subshell

zsh% . ./test.sh
subshell

zsh% env -i /bin/bash --norc --noprofile
bash-3.2$ ./test.sh
sourced

bash-3.2$ /usr/bin/zsh ./test.sh
sourced

bash-3.2$ /bin/bash ./test.sh
sourced

bash-3.2$ source ./test.sh
sourced

bash-3.2$ . ./test.sh
sourced

현재 대화형 셸이 이면 zsh스크립트는 매번 완전히 잘못된 결과를 얻습니다. 성능이 조금 더 좋습니다 bash(비록 하루에 두 번 정확하게 시간을 유지하는 스톱워치를 연상시키기는 하지만).

이것들은 실제로끔찍한결과를 보면 이 접근 방식에 대한 확신이 거의 없습니다.

더 좋은 게 있나요?

답변1

if [[ $ZSH_EVAL_CONTEXT == 'toplevel' ]]; then
    # We're not being sourced so run the colors command which in turn sources
    # this script and uses its content to produce representative output.
    colors
fi

커티스 레드zsh-users 메일링 리스트에서.

답변2

서브셸에 있는지 확인하려면 다음 값을 확인하세요 $ZSH_SUBSHELL.

if (( ZSH_SUBSHELL )); then
  echo "subshell, $ZSH_SUBSHELL fork(s) deep"
else
  echo "not a subshell"
fi

source귀하가 D 인지 확인하려면 zsh_eval_context해당 단어가 포함되어 있는지 확인하십시오 file.

if (( zsh_eval_context[(I)file] )); then
  echo "sourced"
else
  echo "not sourced"
fi

답변3

쉘 레벨을 얻을 수 있습니다 :

[ $SHLVL -gt 1 ] && echo "subshell"

또한 사용 가능합니다(ZSH에만 해당) $ZSH_SUBSHELL.

물론, 둥지를 만들면 부서질 것입니다.

답변4

당신이 찾고 있는 답은 로그인과 대화형 쉘의 차이점이 아닌가요?

localhost% cat foo
#!/usr/bin/env zsh

[[ $- == *i* ]] && print ' interactive=sourced' || print ' login=called'

localhost% source foo
 interactive=sourced
localhost% zsh foo   
 login=called

관련 정보