Beenden Sie die Bash-Funktion, nicht das Terminal

Beenden Sie die Bash-Funktion, nicht das Terminal

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
}

<<<< hereWenn Zookeeper bereits installiert ist, möchte ich in der markierten Zeile das darunter liegende Skript beenden. Aber die Verwendung exitbeendet das Terminal selbst.

Antwort1

Kurz zusammengefasst

Verwenden Sie returnanstelle von exitUND führen Sie Ihr Skript mit source your-script.shaka aus.. your-script.sh

Alle Einzelheiten

Wenn Sie ein Skript mit einer exitdarin 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“ exitwird 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), exithä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.

returnWenn 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 returnnur verwenden, um eine Funktion oder ein Skript mit Quelle zu beenden (Skript wurde mit der . ./<scriptname>Syntax ausgeführt).

Antwort2

exit 1Versuchen 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 installZookFunktion 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 installZookFunktion 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.

exitbeendet die aktuelle Shell-Sitzung. Wenn die Funktion ausgeführt wird, exitbeendet sie die Shell, die sie aufgerufen hat.

returngibt von einer Funktion (oder einer Skriptdatei mit Quelltext) zurück. Wenn die Funktion statt exitverwendet 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. returnWenn 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.

verwandte Informationen