以下のような 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
変更するだけです。スクリプト内に関数を呼び出す別のコード(表示していないもの)がある場合は、そのコードでexit
return
さらに関数の戻りステータスに反応します。
例えば
installZook || return
これがスクリプト内の関数の一部ではなく、スクリプトをソース化した場合、関数がゼロ以外の終了コードを返すと、制御がシェルに戻ります。