端末ではなくbash関数を終了します


12

私はzookeeperをインストールする以下のbashスクリプトを持っていますが、まだインストールされていない場合のみです。

##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
このスクリプトをどのように起動しますか?
Benoit

2
return 1代わりに使用exit 1
polym

回答:


21

TL; DR

return代わりにを使用exitし、source your-script.sh別名でスクリプトを実行します。. your-script.sh

全詳細

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

端末セッションで開始された現在のシェル内で起動した場合(. ./<scriptname>任意のexitをと、メインシェルが閉じられ、端末セッションに沿って開始されます。

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

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

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


returnスクリプトファイルを停止しません
Nam G VU

@NamGVU終了するのではなく戻るのが正しいことです。それらがファイルをソースし、関数を呼び出すと仮定すると(関数のexit/ returnは、指定されたファイルのソース中に呼び出されません)、関数がを使用した場合、シェルセッションは(ターミナルと一緒に)終了しますexit。を使用returnすると、呼び出し元のシェルに制御を戻します。ソース付きのスクリプト(これは重要ではありません)から戻る場合は、シェルセッションを終了するのとreturn同じようにそれを行うのが正しい方法exitです。
クサラナンダ

最初にスクリプトをどのように実行するかによって異なります
Nam G VU

@NamGVUファイル内の関数への呼び出しはありません。ファイルを調達または実行するだけでは関数は呼び出されません。関数がシェルセッションとターミナルを終了する方法を、最初にファイルを取得してからターミナルで呼び出す以外の方法で説明します。
クサラナンダ

共有のためのより良い。その時、私たちはその話題からそれほど遠くないと思います。
Nam G VU

1

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

表示されているのがinstallZook関数の呼び出しを含む大きなスクリプトの一部のみである場合、関数は、通常のシェルスクリプトとして実行されているのではなく、スクリプトがソースの場合にのみターミナルを終了させることができます。

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

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

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

例えば

installZook || return

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.