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 exit
sale del propio terminal.
Respuesta1
TL;DR
Úselo return
en lugar de exit
Y ejecute su script con source your-script.sh
aka.. your-script.sh
Todos los detalles
Si inicia un script con una exit
declaració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 exit
cerrará 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 exit
habrí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 return
en lugar de exit
le permitirá seguir ejecutando su script . ./<script name>
sin cerrar el shell actual. Pero debe usarlo return
para 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 1
intente 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 installZook
funció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 installZook
funció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.
exit
finaliza la sesión de shell actual. Cuando la función se ejecuta, exit
finaliza el shell que la llamó.
return
regresa 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 installZook
función desde el shell, todo lo que debe hacer es cambiar el exit
archivo 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.