Skip to content

Instantly share code, notes, and snippets.

@mazgi
Last active October 23, 2020 22:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mazgi/614979980c48f4f34bfceebf4fb5508a to your computer and use it in GitHub Desktop.
Save mazgi/614979980c48f4f34bfceebf4fb5508a to your computer and use it in GitHub Desktop.
is the zsh script being sourced?

is the zsh script being sourced?

a traditional way

[[ $_ = $0 ]] && {
  echo 'the script is being sourced.'
  return 0
} 

It works.

source traditional-way.zsh
the script is being sourced../traditional-way.zsh
probably, it was running as a subshell.

However, this way is broken easily as follows.

:
[[ $_ = $0 ]] && {
  echo 'the script is being sourced.'
  return 0
}
if [[ $_ = $0 ]]; then
  echo 'the script is being sourced.'
  return 0
fi
source traditional-way-wrong-1.zsh 
probably, it was running as a subshell.source traditional-way-wrong-2.zsh 
probably, it was running as a subshell.

a more effective way on zsh

if [[ ${#funcstack[@]} -ne 0 ]]; then
  echo 'the script is being sourced.'
  return 0
fi
source effective-way.zsh
the script is being sourced../effective-way.zsh
certainly, it was running as a subshell.

Links

zsh --version
zsh 5.8 (x86_64-pc-linux-gnu)

run as a subshell

./funcstack.zsh
#funcstack: 0
funcstack: 
sh funcstack.zsh
#funcstack: 0
funcstack: 
zsh -ic ./funcstack.zsh
#funcstack: 0
funcstack: 

sourced

source funcstack.zsh  
#funcstack: 1
funcstack: funcstack.zsh
zsh -ic 'source funcstack.zsh' 
#funcstack: 1
funcstack: funcstack.zsh
#!/usr/bin/env -S zsh -eux
:
if [[ ${#funcstack[@]} -ne 0 ]]; then
echo 'the script is being sourced.'
return 0
fi
echo 'certainly, it was running as a subshell.'
#!/usr/bin/env -S zsh -eu
echo "#funcstack: ${#funcstack[@]}"
echo "funcstack: ${funcstack[@]}"
#!/usr/bin/env -S zsh -eux
:
[[ $_ = $0 ]] && {
echo 'the script is being sourced.'
return 0
}
echo 'probably, it was running as a subshell.'
#!/usr/bin/env -S zsh -eux
if [[ $_ = $0 ]]; then
echo 'the script is being sourced.'
return 0
fi
echo 'probably, it was running as a subshell.'
#!/usr/bin/env -S zsh -eux
[[ $_ = $0 ]] && {
echo 'the script is being sourced.'
return 0
}
echo 'probably, it was running as a subshell.'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment