ターミナルではなくbash関数を終了する

ターミナルではなくbash関数を終了する

以下のような bash スクリプトがあり、これは Zookeeper をインストールしますが、まだインストールされていない場合に限ります。

##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、zookeeper がすでにインストールされている場合、その下のスクリプトを終了する必要があります。ただし、 を使用すると、exitターミナル自体が終了します。

答え1

要約

returnの代わりにを使用しexit、aka を使用してスクリプトを実行しますsource your-script.sh. your-script.sh

全詳細

ステートメントを含むスクリプトを起動する場合はexit、現在の子の子として起動する必要があります。

ターミナル セッションで開始された現在のシェル内で起動すると ( . ./<scriptname>any を使用するとexit、ターミナル セッションで開始されたメイン シェルが閉じられます)。

スクリプトをbash ./<scriptname>(または他のシェルの代わりに)のように起動した場合、バッシュ)を実行すると、exit端末で使用されているシェルではなく、子シェルが停止します。

スクリプトに実行権限がある場合、シェル名を指定せずに直接実行すると、子シェルでも実行されます。

returnの代わりにを使用すると、現在のシェルを閉じずにexitを使用したスクリプトを起動できます。ただし、関数のみまたはソース スクリプト (構文を使用して実行されたスクリプト) を終了するには を. ./<script name>使用する必要があります。return. ./<scriptname>

答え2

を使用する代わりに、exit 1を使用してみてくださいreturn 1

答え3

指定されたスクリプトがシェル セッション (およびターミナル) を終了できる唯一の方法は、スクリプトをソース化して (installZook現在のシェル セッションに関数をインストールするため)、シェルで関数を実行することです。

あなたが表示しているものが、関数の呼び出しを含む大きなスクリプトの一部に過ぎない場合installZook、その関数は、スクリプトがソースただし、通常のシェル スクリプトとして実行されるわけではありません。

exit現在のシェル セッションを終了します。関数が実行されるとexit、それを呼び出したシェルが終了します。

return関数 (またはソース スクリプト ファイル) から戻ります。関数が の代わりに をexit使用した場合return、終了せずに呼び出し環境 (おそらく関数を呼び出した対話型シェル) に制御が返されます。

シェルから関数を手動で実行する場合は、を にinstallZook変更するだけです。スクリプト内に関数を呼び出す別のコード(表示していないもの)がある場合は、そのコードでexitreturnさらに関数の戻りステータスに反応します。

例えば

installZook || return

これがスクリプト内の関数の一部ではなく、スクリプトをソース化した場合、関数がゼロ以外の終了コードを返すと、制御がシェルに戻ります。

関連情報