web-dev-qa-db-ja.com

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

私は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を使用すると、ターミナル自体が終了します。

12
prayagupd

TL; DR

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

全詳細

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

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

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

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

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

21
Benoit

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

表示しているものがinstallZook関数の呼び出しを含むより大きなスクリプトの一部のみである場合でも、スクリプトがsourcedの場合にのみ、関数は端末を終了させることができます。ただし、通常のシェルスクリプトとして実行することはできません。

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

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

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

例えば

installZook || return

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

1
Kusalananda

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

0
ryekayo