Comment un script zsh peut-il vérifier s'il provient?

La réponse acceptée pour une question similaire pour bash ne semble pas fonctionner pour zsh . En fait, si je copy essentiellement le même code donné dans cette réponse, pour produire le script

 #!/usr/bin/zsh - # test.sh [[ $_ != $0 ]] && echo "sourced\n" || echo "subshell\n" 

la sortie correspond rarement à la situation réelle:

 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 

Lorsque le shell interactif actuel est zsh , le script le fait exactement à chaque fois. Il vaut un peu mieux sous bash (bien que d'une manière qui callbackle la montre arrêtée qui obtient le time exactement deux fois par jour).

Ces résultats vraiment abyssaux me donnent peu de confiance dans cette approche.

Y at-il quelque chose de mieux?

 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 

Via Kurtis Rader sur la list de diffusion zsh-users .

Vous pourriez get le niveau de la coquille:

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

Il y a aussi (ZSH uniquement) $ZSH_SUBSHELL .

Évidemment, ceux-ci se cassent si vous nidifiez.

Si vous envisagez seulement de travailler avec zsh, il semble que vous pourriez simplement échanger les deux cas:

 #!/usr/bin/env zsh - # test.sh [[ $_ != $0 ]] && echo "subshell\n" || echo "sourced\n" 

Cela pourrait ne pas être assez bon pour vous, si vous en avez besoin pour soutenir bash aussi.

(J'ai aussi changé le shebang parce que mon zsh n'est pas dans /usr/bin , mais cela ne devrait pas vous affecter).

La réponse n'est-elle pas la différence entre la connection et le shell interactif?

 localhost% cat foo #!/usr/bin/env zsh [[ $- == *i* ]] && print ' interactive=sourced' || print ' login=called' localhost% source foo interactive=sourced localhost% zsh foo login=called