Bash
退出 bash 函式,而不是終端
我有一個如下的 bash 腳本,它安裝 zookeeper,但前提是尚未安裝。
##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 }
在標記的行
<<<< here
,如果已經安裝了zookeeper,我想要的是退出它下面的腳本。但是使用exit
退出終端本身。
TL; 博士
使用aka
return
而不是exit
AND 執行您的腳本。source your-script.sh``. your-script.sh
完整的細節
如果啟動其中包含語句的腳本,
exit
則必須將其作為目前孩子的孩子啟動。如果您在終端會話啟動的目前 shell 中啟動它(使用
. ./<scriptname>
anyexit
將關閉主 shell,主 shell 是沿著終端會話啟動的。如果您像啟動了腳本
bash ./<scriptname>
(或任何其他 shell 而不是bash),那麼exit
將停止您的子 shell 而不是終端使用的那個。如果您的腳本具有可執行權限,則直接執行它而不給出 shell 的名稱也會在子 shell 中執行它。
使用
return
而不是exit
將允許您在. ./<script name>
不關閉目前 shell 的情況下仍然使用啟動腳本。但是您需要使用return
僅退出函式或源腳本(使用. ./<scriptname>
語法執行的腳本)。