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 debajo de él. Pero el uso exit
sale del terminal en sí.
bash
shell-script
function
exit
prayagupd
fuente
fuente
return 1
lugar deexit 1
Respuestas:
TL; DR
Use en
return
lugar deexit
Y ejecute su script consource your-script.sh
aka.. your-script.sh
Todos los detalles
Si inicia un script con una
exit
declaración, debe iniciarlo como un elemento secundario de su elemento actual.Si lo inicia dentro del shell actual de iniciado con su sesión de terminal (el uso de
. ./<scriptname>
cualquieraexit
cerrará el shell principal, el que comenzó a lo largo de su sesión de terminal.Si hubiera lanzado su script como
bash ./<scriptname>
(o cualquier otro shell en lugar de bash ), entoncesexit
habría detenido su shell hijo 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 hijo.
El uso en
return
lugar deexit
le permitirá seguir ejecutando su script. ./<script name>
sin cerrar el shell actual. Pero debe usarreturn
para salir solo de una función o un script de origen (el script se ejecutó utilizando la. ./<scriptname>
sintaxis).fuente
return
NO detendrá el archivo de scriptexit
/return
en la función mientras se obtiene el archivo dado), la sesión de shell finalizará (junto con el terminal) si se utiliza la función . Con , manejaría el control de regreso al shell de llamada. Tenga en cuenta que si desea regresar de un script de origen (del que no se trata), es la forma correcta de hacerlo también, ya que terminaría la sesión de shell.exit
return
return
exit
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 el terminal termine si el script se obtiene , pero no a través de la ejecución como un script de shell ordinario.exit
termina la sesión de shell actual. Cuando la función se ejecutaexit
, termina el shell que la llamó.return
regresa de una función (o un archivo de script de origen). Si la función, en lugar deexit
usarsereturn
, devolvería el control al entorno de llamada (probablemente el shell interactivo desde el que llamó a la función) sin salir de ella.Si ejecuta manualmente la
installZook
función desde el shell, todo lo que debe hacer es cambiar la funciónexit
areturn
. Si hay otra pieza de código en su script que llama a la función (y que no está mostrando), entonces esa pieza de código debe reaccionar adicionalmente al estado de retorno de la función.Por ejemplo
Si esto no forma parte de ninguna función en el script, y si obtuvo el script, devolvería el control al shell si la función devolviera un código de salida distinto de cero.
fuente
En lugar de usar
exit 1
intente usarreturn 1
.fuente
return
regresará de laInstallZook()
función, no saldrá del script.