Ich habe ein Bash-Skript wie unten, das zookeeper installiert, aber nur, wenn es nicht bereits installiert ist.
##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
}
<<<< here
Wenn in der markierten Zeile zookeeper bereits installiert ist, möchte ich das darunter liegende Skript beenden. Mit using wird exit
das Terminal selbst beendet.
bash
shell-script
function
exit
betenagupd
quelle
quelle
return 1
anstelle vonexit 1
Antworten:
TL; DR
Verwenden Sie
return
anstelle vonexit
UND führen Sie Ihr Skript mitsource your-script.sh
aka.. your-script.sh
Alle Einzelheiten
Wenn Sie ein Skript mit einer
exit
Anweisung starten, müssen Sie es als untergeordnetes Element Ihres aktuellen untergeordneten Elements starten.Wenn Sie es in der aktuellen Shell starten, die mit Ihrer Terminalsitzung gestartet wurde (mit
. ./<scriptname>
anyexit
wird die Haupt-Shell geschlossen, die entlang Ihrer Terminalsitzung gestartet wurde.Wenn Sie Ihr Skript wie
bash ./<scriptname>
(oder eine andere Shell anstelle von Bash ) gestartetexit
hätten , hätte dies Ihre untergeordnete Shell gestoppt und nicht die von Ihrem Terminal verwendete.Wenn Ihr Skript über ausführbare Berechtigungen verfügt, wird es durch direkte Ausführung ohne Angabe des Shell-Namens auch in einer untergeordneten Shell ausgeführt.
Wenn Sie
return
anstelle von verwendenexit
, können Sie Ihr Skript weiterhin mit verwenden,. ./<script name>
ohne die aktuelle Shell zu schließen. Sie müssen jedochreturn
nur eine Funktion oder ein Quellenskript beenden (das Skript wurde mit der. ./<scriptname>
Syntax ausgeführt).quelle
return
wird die Skriptdatei NICHT anhaltenexit
/return
in der Funktion wird beim Sourcing der angegebenen Datei nicht aufgerufen), wird die Shell-Sitzung (zusammen mit dem Terminal) beendet, wenn die Funktion verwendet wirdexit
. Mitreturn
würde es die Kontrolle zurück zur aufrufenden Shell übernehmen. Beachten Sie, dass, wenn Sie von einem Sourcing-Skript zurückkehren möchten (worum es hier nicht geht), dies auchreturn
der richtige Weg ist, umexit
die Shell-Sitzung zu beenden.Das angegebene Skript kann die Shell-Sitzung (und damit das Terminal) nur beenden, indem Sie das Skript beziehen (um die
installZook
Funktion in der aktuellen Shell-Sitzung zu installieren ) und die Funktion dann in der Shell ausführen.Wenn das, was Sie anzeigen, nur ein Teil eines größeren Skripts ist, das einen Aufruf der
installZook
Funktion enthält, kann die Funktion dazu führen, dass das Terminal nur beendet wird, wenn das Skript bezogen wird , jedoch nicht als normales Shell-Skript ausgeführt wird.exit
Beendet die aktuelle Shell-Sitzung. Wenn die Funktion ausgeführtexit
wird, wird die Shell beendet, die sie aufgerufen hat.return
kehrt von einer Funktion (oder einer Sourcing-Skriptdatei) zurück. Wenn die Funktion anstelle vonexit
verwendet wirdreturn
, wird die Steuerung an die aufrufende Umgebung zurückgegeben (wahrscheinlich die interaktive Shell, von der aus Sie die Funktion aufgerufen haben), ohne sie zu beenden.Wenn Sie manuell die laufen
installZook
Funktion aus der Schale, dann werden alle sollten Sie tun müssen , ist das zu ändern ,exit
zureturn
. Wenn Ihr Skript einen anderen Code enthält, der die Funktion aufruft (und den Sie nicht anzeigen), muss dieser Code zusätzlich auf den Rückgabestatus der Funktion reagieren.Zum Beispiel
Wenn dies Teil einer Funktion im Skript war und Sie das Skript bezogen haben, wird die Steuerung an die Shell zurückgegeben, wenn die Funktion einen Exit-Code ungleich Null zurückgibt.
quelle
Anstatt zu verwenden,
exit 1
versuchen Sie es mitreturn 1
.quelle
return
kehrt von derInstallZook()
Funktion zurück und beendet das Skript nicht.