Return an exit code without closing shell

You can use x"${BASH_SOURCE[0]}" == x"$0" to test if the script was sourced or called (false if sourced, true if called) and return or exit accordingly.


Use this instead of exit or return:

[ $PS1 ] && return || exit;

Works whether sourced or not.


The answer to the question title (not in the body as other answers have addressed) is:

Return an exit code without closing shell

(exit 33)

If you need to have -e active and still avoid exiting the shell with a non-zero exit code, then do:

(exit 33) && true

The true command is never executed but is used to build a compound command that is not exited by the -e shell flag.

That sets the exit code without exiting the shell (nor a sourced script).

For the more complex question of exiting (with an specific exit code) either if executed or sourced:

#!/bin/bash
[ "$BASH_SOURCE" == "$0" ] &&
    echo "This file is meant to be sourced, not executed" && 
        exit 30

return 88

Will set an exit code of 30 (with an error message) if executed.
And an exit code of 88 if sourced. Will exit both the execution or the sourcing without affecting the calling shell.


Another option is to use a function and put the return values in that and then simply either source the script (source processStatus.sh) or call the script (./processStatus.sh) . For example consider the processStatus.sh script that needs to return a value to the stopProcess.sh script but also needs to be called separately from say the command line without using source (only relevant parts included) Eg:

check_process ()
{
  if [ $1 -eq "50" ]
  then
    return 1       
  else
    return 0
  fi       
}

and

source processStatus.sh $1
RET_VALUE=$?
if [ $RET_VALUE -ne "0" ]
then
  exit 0
fi