Beenden Sie die Bash-Funktion, nicht das Terminal


12

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
}

<<<< hereWenn in der markierten Zeile zookeeper bereits installiert ist, möchte ich das darunter liegende Skript beenden. Mit using wird exitdas Terminal selbst beendet.


1
Wie starte ich dieses Skript?
Benoit

2
Verwenden Sie return 1anstelle vonexit 1
Polym

Antworten:


21

TL; DR

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

Alle Einzelheiten

Wenn Sie ein Skript mit einer exitAnweisung 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>any exitwird die Haupt-Shell geschlossen, die entlang Ihrer Terminalsitzung gestartet wurde.

Wenn Sie Ihr Skript wie bash ./<scriptname>(oder eine andere Shell anstelle von Bash ) gestartet exithä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 returnanstelle von verwenden exit, können Sie Ihr Skript weiterhin mit verwenden, . ./<script name>ohne die aktuelle Shell zu schließen. Sie müssen jedoch returnnur eine Funktion oder ein Quellenskript beenden (das Skript wurde mit der . ./<scriptname>Syntax ausgeführt).


returnwird die Skriptdatei NICHT anhalten
Nam G VU

@NamGVU Zurückkehren statt beenden ist das Richtige. Unter der Annahme, dass sie die Datei als Quelle bereitstellen und dann die Funktion aufrufen (das exit/ returnin der Funktion wird beim Sourcing der angegebenen Datei nicht aufgerufen), wird die Shell-Sitzung (zusammen mit dem Terminal) beendet, wenn die Funktion verwendet wird exit. Mit returnwü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 auch returnder richtige Weg ist, um exitdie Shell-Sitzung zu beenden.
Kusalananda

Es hängt davon ab, wie Sie das Skript an erster Stelle ausführen
Nam G VU

@NamGVU Die Funktion in der Datei wird nicht aufgerufen. Nur das Beschaffen oder Ausführen der Datei würde die Funktion nicht aufrufen. Erläutern Sie, wie die Funktion die Shell-Sitzung und das Terminal auf andere Weise beendet, als indem Sie zuerst die Datei beziehen und sie dann im Terminal aufrufen.
Kusalananda

Danke fürs Teilen. Ich denke, wir gehen dann nicht zu weit vom Thema.
Nam G VU

1

Das angegebene Skript kann die Shell-Sitzung (und damit das Terminal) nur beenden, indem Sie das Skript beziehen (um die installZookFunktion 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 installZookFunktion 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.

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

returnkehrt von einer Funktion (oder einer Sourcing-Skriptdatei) zurück. Wenn die Funktion anstelle von exitverwendet wird return, 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 installZookFunktion aus der Schale, dann werden alle sollten Sie tun müssen , ist das zu ändern , exitzu return. 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

installZook || return

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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.