J'ai un script bash comme ci-dessous qui installe zookeeper mais seulement s'il n'est pas déjà installé.
##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
}
À la ligne marquée <<<< here
, si zookeeper est déjà installé, ce que je veux, c'est quitter le script en dessous. Mais l'utilisation exit
quitte le terminal lui-même.
bash
shell-script
function
exit
Prayagupd
la source
la source
return 1
place deexit 1
Réponses:
TL; DR
Utilisez
return
au lieu deexit
ET exécutez votre script avecsource your-script.sh
aka.. your-script.sh
Tous les détails
Si
exit
vous lancez un script contenant une instruction, vous devez le lancer en tant qu'enfant de votre enfant actuel.Si vous le lancez à l'intérieur du shell actuel de a commencé avec votre session de terminal (en utilisant
. ./<scriptname>
anyexit
fermera le shell principal, celui démarré le long de votre session de terminal.Si vous aviez lancé votre script comme
bash ./<scriptname>
(ou tout autre shell au lieu de bash ), alors vousexit
auriez arrêté votre shell enfant et non celui utilisé par votre terminal.Si votre script dispose d'autorisations exécutables, l'exécuter directement sans donner le nom du shell l'exécutera également dans un shell enfant.
Utiliser
return
au lieu deexit
vous permettra de lancer votre script en utilisant. ./<script name>
sans fermer le shell courant. Mais vous devez utiliserreturn
pour quitter une fonction uniquement ou un script source (script exécuté en utilisant la. ./<scriptname>
syntaxe).la source
return
N'arrêtera PAS le fichier de scriptexit
/return
dans la fonction ne serait pas appelé lors de la recherche du fichier donné), la session shell se terminerait (avec le terminal) si la fonction était utiliséeexit
. Avecreturn
, il gérerait le contrôle vers le shell appelant. Notez que si vous souhaitez revenir à partir d'un script d'origine (dont il ne s'agit pas),return
c'est également la bonne façon de le faire, car celaexit
mettrait fin à la session shell.La seule façon pour le script donné de terminer la session shell (et donc le terminal) est de vous procurer le script (pour installer la
installZook
fonction dans la session shell actuelle), puis d'exécuter la fonction dans le shell.Si ce que vous montrez n'est qu'une partie d'un script plus grand contenant un appel à la
installZook
fonction, alors la fonction ne peut toujours provoquer la terminaison du terminal que si le script provient , mais pas en étant exécuté comme un script shell ordinaire.exit
termine la session shell en cours. Lorsque la fonction s'exécute,exit
elle termine le shell qui l'a appelée.return
renvoie à partir d'une fonction (ou d'un fichier de script d'origine). Si la fonction, au lieu deexit
, était utiliséereturn
, elle retournerait le contrôle à l'environnement appelant (probablement le shell interactif à partir duquel vous avez appelé la fonction) sans le quitter.Si vous exécutez manuellement la
installZook
fonction à partir du shell, alors tout ce que vous devez faire est de changer leexit
enreturn
. S'il y a un autre morceau de code dans votre script qui appelle la fonction (et que vous ne montrez pas), alors ce morceau de code doit également réagir au statut de retour de la fonction.Par exemple
Si cela ne faisait partie d'aucune fonction dans le script, et si vous aviez fourni le script, il retournerait le contrôle au shell si la fonction renvoyait un code de sortie différent de zéro.
la source
Au lieu d'utiliser,
exit 1
essayez d'utiliserreturn 1
.la source
return
reviendra de laInstallZook()
fonction, ne quittera pas le script.