Salga de la función bash, no de la terminal

Salga de la función bash, no de la terminal

Tengo un script bash como el siguiente que instala zookeeper pero solo si aún no está instalado.

##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
}

En la línea marcada <<<< here, si zookeeper ya está instalado, lo que quiero es salir del script que se encuentra debajo. Pero el uso exitsale del propio terminal.

Respuesta1

TL;DR

Úselo returnen lugar de exitY ejecute su script con source your-script.shaka.. your-script.sh

Todos los detalles

Si inicia un script con una exitdeclaración, debe iniciarlo como hijo de su hijo actual.

Si lo inicia dentro del shell actual o iniciado con su sesión de terminal (usar . ./<scriptname>cualquiera exitcerrará el shell principal, el que comenzó a lo largo de su sesión de terminal).

Si hubiera iniciado su script como bash ./<scriptname>(o cualquier otro shell en lugar deintento), entonces exithabría detenido su shell secundario y no el utilizado por su terminal.

Si su script tiene permisos ejecutables, ejecutarlo directamente sin dar el nombre del shell también lo ejecutará en un shell secundario.

Usar returnen lugar de exitle permitirá seguir ejecutando su script . ./<script name>sin cerrar el shell actual. Pero debe usarlo returnpara salir solo de una función o de un script de origen (el script se ejecutó usando la . ./<scriptname>sintaxis).

Respuesta2

En lugar de usar, exit 1intente usar return 1.

Respuesta3

La única forma en que el script dado puede terminar la sesión de shell (y por lo tanto el terminal) es obteniendo el script (para instalar la installZookfunción en la sesión de shell actual) y luego ejecutando la función en el shell.

Si lo que está mostrando es solo una parte de un script más grande que contiene una llamada a la installZookfunción, entonces la función solo puede hacer que la terminal finalice si el script esde origen, pero no ejecutándolo como un script de shell normal.

exitfinaliza la sesión de shell actual. Cuando la función se ejecuta, exitfinaliza el shell que la llamó.

returnregresa de una función (o un archivo de script de origen). Si la función, en lugar de exit, usara return, devolvería el control al entorno de llamada (probablemente el shell interactivo desde el que llamó a la función) sin salir de él.

Si ejecuta manualmente la installZookfunción desde el shell, todo lo que debe hacer es cambiar el exitarchivo a return. Si hay otro fragmento de código en su secuencia de comandos que llama a la función (y que no muestra), entonces ese fragmento de código debeademásreaccionar al estado de retorno de la función.

Por ejemplo

installZook || return

Si esto no fuera parte de ninguna función en el script, y si usted obtuvo el script, devolvería el control al shell si la función devolviera un código de salida distinto de cero.

información relacionada