I have a bash script as below which installs zookeeper but only if not installed already.
##zookeper
installZook(){
ZOOK_VERSION="3.4.5"
ZOOK_TOOL="zookeeper-${ZOOK_VERSION}"
ZOOK_DOWNLOAD_URL="http://www.us.apache.org/dist/zookeeper/${ZOOK_TOOL}/${ZOOK_TOOL}.tar.gz"
if [ -e $DEFAULT_INSTALLATION_DEST/${ZOOK_TOOL} ]; then
echo "${ZOOK_TOOL} alreay installed";
exit 1; # <<<< here
elif [ ! -e $DEFAULT_SOURCE_ROOT/${ZOOK_TOOL}.tar.gz ]; then
wgetIt $ZOOK_DOWNLOAD_URL
else
echo "[info] : $DEFAULT_SOURCE_ROOT/$ZOOK_TOOL already exists"
fi
sudo mkdir -p /var/lib/zookeeper
sudo mkdir -p /var/log/zookeeper
tarIt "$DEFAULT_SOURCE_ROOT/$ZOOK_TOOL.tar.gz"
sudo chmod 777 -R $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL
cp $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL/conf/zoo_sample.cfg $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL/conf/zoo.cfg
cat >> ~/.bash_profile <<'EOF'
###############################
########### ZOOK ###############
###############################
ZOOK_HOME=/usr/local/zookeper-3.4.5
export ZOOK_HOME
export PATH=$PATH:$ZOOK_HOME/bin
EOF
}
At the line marked <<<< here
, if zookeeper is already installed, what I want is to exit the script below it. But using exit
exits the terminal itself.
Best Answer
TL;DR
Use
return
instead ofexit
AND run your script withsource your-script.sh
aka.. your-script.sh
Full details
If launching a script with an
exit
statement in it, you have to launch it as a child of you current child.If you launch it inside the current shell of started with your terminal session (using
. ./<scriptname>
anyexit
will close the main shell, the one started along your terminal session.If you had launched your script like
bash ./<scriptname>
(or any other shell instead of bash), thenexit
would have stopped your child shell and not the one used by your terminal.If your script has executable permissions, executing it directly without giving the name of the shell will execute it in a child shell too.
Using
return
instead ofexit
will allow you to still launch your script using. ./<script name>
without closing the current shell. But you need to usereturn
to exit from a function only or a sourced script (script ran using the. ./<scriptname>
syntax).