Ich habe ein Bash-Skript wie unten, das Zookeeper installiert, aber nur, wenn es noch nicht 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 Zookeeper bereits installiert ist, möchte ich in der markierten Zeile das darunter liegende Skript beenden. Aber die Verwendung exit
beendet das Terminal selbst.
Antwort1
Kurz zusammengefasst
Verwenden Sie return
anstelle von exit
UND führen Sie Ihr Skript mit source your-script.sh
aka aus.. your-script.sh
Alle Einzelheiten
Wenn Sie ein Skript mit einer exit
darin enthaltenen Anweisung starten, müssen Sie es als untergeordnetes Element Ihres aktuellen untergeordneten Elements starten.
Wenn Sie es innerhalb der aktuellen Shell starten, die während Ihrer Terminalsitzung gestartet wurde (mit . ./<scriptname>
„any“ exit
wird die Hauptshell geschlossen, die während Ihrer Terminalsitzung gestartet wurde).
Wenn Sie Ihr Skript wie folgt gestartet hätten bash ./<scriptname>
(oder eine andere Shell anstelle vonSchlag), exit
hätte dann Ihre untergeordnete Shell gestoppt und nicht die, die von Ihrem Terminal verwendet wird.
Wenn Ihr Skript über Ausführungsberechtigungen verfügt, wird es durch die direkte Ausführung ohne Angabe des Shell-Namens auch in einer untergeordneten Shell ausgeführt.
return
Wenn Sie anstelle von verwenden exit
, können Sie Ihr Skript trotzdem starten, . ./<script name>
ohne die aktuelle Shell zu schließen. Sie müssen jedoch return
nur verwenden, um eine Funktion oder ein Skript mit Quelle zu beenden (Skript wurde mit der . ./<scriptname>
Syntax ausgeführt).
Antwort2
exit 1
Versuchen Sie anstelle von return 1
.
Antwort3
Die einzige Möglichkeit, wie das angegebene Skript die Shell-Sitzung (und damit das Terminal) beenden kann, besteht darin, dass Sie das Skript als Quelle verwenden (um die installZook
Funktion in der aktuellen Shell-Sitzung zu installieren) und die Funktion dann in der Shell ausführen.
Wenn das, was Sie zeigen, nur ein Teil eines größeren Skripts ist, das einen Aufruf der installZook
Funktion enthält, dann kann die Funktion trotzdem nur dann zum Beenden des Terminals führen, wenn das Skriptbezogen, aber nicht durch die Ausführung als normales Shell-Skript.
exit
beendet die aktuelle Shell-Sitzung. Wenn die Funktion ausgeführt wird, exit
beendet sie die Shell, die sie aufgerufen hat.
return
gibt von einer Funktion (oder einer Skriptdatei mit Quelltext) zurück. Wenn die Funktion statt exit
verwendet return
, gibt sie die Kontrolle an die aufrufende Umgebung zurück (wahrscheinlich die interaktive Shell, aus der Sie die Funktion aufgerufen haben), ohne sie zu verlassen.
Wenn Sie die Funktion manuell von der Shell aus ausführen installZook
, müssen Sie nur in ändern exit
. return
Wenn Ihr Skript einen anderen Codeabschnitt enthält, der die Funktion aufruft (und den Sie nicht anzeigen), muss dieser Codeabschnittzusätzlichauf den Rückgabestatus der Funktion reagieren.
Zum Beispiel
installZook || return
Wenn dies Teil keiner Funktion im Skript wäre und Sie das Skript als Quelle verwendet hätten, würde die Kontrolle an die Shell zurückgegeben, wenn die Funktion einen Exit-Code ungleich Null zurückgegeben hätte.