Bash

退出 bash 函式,而不是終端

  • January 14, 2020

我有一個如下的 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; 博士

使用akareturn而不是exitAND 執行您的腳本。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>語法執行的腳本)。

引用自:https://unix.stackexchange.com/questions/138730