tags:

views:

160

answers:

5

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?

+1  A: 

I 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.

Michal Čihař
A: 

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 ..."
barroyo
+2  A: 

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).

Dennis Williamson
+2  A: 

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.

The quotes aren't needed with [[ ]], only [ ]
Charles Duffy
A: 

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
jim mcnamara