How are you running the script? The circumstances of a subprocess's exit shouldn't affect the shell that ran it... unless you're sourcing the script into your running shell.
./my-script.sh # this should terminate and leave your shell intact
. my-script.sh # this might terminate and take your shell with it
A 'nix shell is a running process of some shell interpreter (e.g.,
csh). "source"ing a script (which you can do in
bash with the command
source or its alias
.) tells that interpreter to open the indicated file and process its contents. In effect, the script becomes a shortcut for entering commands interactively. Functions defined, variables set, and (in your case)
exits processed take effect in the original shell.
./my-script.sh is a simple file path.
./ refers to the current directory and
my-script.sh to a script within that directory. When the file is marked as executable, the file will be executed. In the case of a script, this means launching a new interpreter process (as defined by the
#! line at the top of the script, or
/bin/sh by default) and using it to interpret the script. Functions defined, variables set, and
exits processed are confined to that new interpreter process.