I have a script where I do not want it to call 'exit' if it's being sourced. Initially I though checking if $0 == bash
but this has problems if the script is sourced from another script, or if the user sources it from ksh. Is there a reliable way of detecting if a script is being sourced?
views:
160answers:
5I don't think there is any portable way to do this in both ksh and bash. In bash you could detect it using caller
output, but I don't think there exists equivalent in ksh.
If your Bash version knows about the BASH_SOURCE array variable, try something like:
# man bash | less -p BASH_SOURCE
#[[ ${BASH_VERSINFO[0]} -le 2 ]] && echo 'No BASH_SOURCE array variable' && exit 1
[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "script ${BASH_SOURCE[0]} is being sourced ..."
This seems to be portable between Bash and Korn:
[[ $_ != $0 ]] && echo "Script is being sourced" || echo "Script is a subshell"
A line similar to this or an assignment like `pathname="$_" (with a later test and action) must be on the first line of the script or on the line after the shebang (which, if used, should be for ksh in order for it to work under the most circumstances).
I would like to suggest a small correction to Dennis' very helpful answer, to make it slightly more portable, I hope:
[ "$_" != "$0" ] && echo "Script is being sourced" || echo "Script is a subshell"
because [[ isn't recognized by the (somewhat anal retentive IMHO) Debian 'POSIX compatible' shell, 'dash'. Also, one may need the quotes to protect against filenames containing spaces, again in said shell.
This works later on in the script and does'nt depend on the _ variable:
## Check to make sure it is not sourced:
Prog=myscript.sh
if [ $(basename $0) = $Prog ]; then
exit 1 # not sourced
fi
or
[ $(basename $0) = $Prog ] && exit