이것수락된 답변유사한 문제에는 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
$ZSH_SUBSHELL
0
서브셸에 있지 않은 경우에만 평가됩니다 . 바라보다http://zsh.sourceforge.net/Doc/Release/Parameters.html#Parameters-Set-By-The-Shell
source
귀하가 D 인지 확인하려면 zsh_eval_context
해당 단어가 포함되어 있는지 확인하십시오 file
.
if (( zsh_eval_context[(I)file] )); then
echo "sourced"
else
echo "not sourced"
fi
$zsh_eval_context
file
이 단어는 또는 내장 함수를 사용할 때와 같이 파일에서 직접 코드를 읽을 때.
포함됩니다source
. 바라보다http://zsh.sourceforge.net/Doc/Release/Parameters.html#Parameters-Set-By-The-Shell$zsh_eval_context[(I)file]
0
단어가 포함되지 않은 경우$zsh_eval_context
결과는 입니다file
. 바라보다https://zsh.sourceforge.io/Doc/Release/Parameters.html#Array-Subscripts
답변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