Como um script zsh pode testar se está sendo originado?

4

A resposta aceita para uma pergunta semelhante de bash parece não funcionar para zsh . Na verdade, se eu copiar basicamente o mesmo código dado nessa resposta, para produzir o script

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

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

a saída quase nunca corresponde à situação real:

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

Quando o shell interativo atual é zsh , o script fica exatamente errado toda vez. É um pouco melhor sob bash (embora, de certo modo, faça lembrar o cronômetro que consegue a hora certa duas vezes ao dia).

Estes resultados realmente abismais me dão pouca confiança nessa abordagem.

Existe algo melhor?

    
por kjo 19.04.2013 / 16:20

3 respostas

4

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 na lista de discussão zsh-users .

    
por 04.12.2014 / 08:10
1

Você pode obter o nível da concha:

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

Há também (somente ZSH) $ZSH_SUBSHELL .

Obviamente, isso quebra se você estiver aninhando.

    
por 19.04.2013 / 17:02
0

A resposta não está procurando a diferença entre o login e o shell interativo?

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

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

localhost% source foo
 interactive=sourced
localhost% zsh foo   
 login=called
    
por 14.09.2014 / 02:58

Tags