退出 bash 功能,而不是终端

pra*_*upd 17 bash shell-script function exit

我有一个 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
}
Run Code Online (Sandbox Code Playgroud)

在标记为 的行<<<< here,如果已经安装了 zookeeper,我想要的是退出它下面的脚本。但是 usingexit退出终端本身。

小智 27

TL; 博士

使用akareturn代替exitAND 运行您的脚本source your-script.sh. your-script.sh

详细信息

如果启动一个包含exit语句的脚本,您必须将它作为当前子项的子项启动。

如果您在终端会话中启动的当前 shell 中启动它(使用. ./<scriptname>anyexit将关闭主 shell,那个是在您的终端会话中启动的。

如果您启动了类似bash ./<scriptname>(或任何其他 shell 而不是bash)的脚本,那么exit将会停止您的子 shell 而不是您的终端使用的那个。

如果您的脚本具有可执行权限,则直接在不提供 shell 名称的情况下执行它也会在子 shell 中执行它。

使用return而不是exit将允许您在. ./<script name>不关闭当前外壳的情况下仍然使用启动脚本。但是您需要使用return退出仅函数或源脚本(使用. ./<scriptname>语法运行的脚本)。

  • `return` 不会停止脚本文件 (2认同)