Saya memiliki skrip bash seperti di bawah ini yang menginstal zookeeper tetapi hanya jika belum diinstal.
##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
}
Pada baris yang ditandai <<<< here
, jika zookeeper sudah diinstal, yang saya inginkan adalah keluar dari skrip di bawahnya. Tetapi menggunakan exit
keluar dari terminal itu sendiri.
bash
shell-script
function
exit
prayagupd
sumber
sumber
return 1
sebagai gantiexit 1
Jawaban:
TL; DR
Gunakan
return
alih-alihexit
DAN jalankan skrip Anda dengansource your-script.sh
alias.. your-script.sh
Detail lengkap
Jika meluncurkan skrip dengan
exit
pernyataan di dalamnya, Anda harus meluncurkannya sebagai anak dari Anda anak saat ini.Jika Anda meluncurkannya di dalam shell saat ini dimulai dengan sesi terminal Anda (menggunakan
. ./<scriptname>
apa punexit
akan menutup shell utama, yang dimulai sepanjang sesi terminal Anda.Jika Anda telah meluncurkan skrip Anda seperti
bash ./<scriptname>
(atau shell lain alih-alih bash ), makaexit
akan menghentikan shell anak Anda dan bukan yang digunakan oleh terminal Anda.Jika skrip Anda memiliki izin yang dapat dieksekusi, mengeksekusinya secara langsung tanpa memberikan nama shell akan mengeksekusinya dalam child shell juga.
Menggunakan
return
bukanexit
akan memungkinkan Anda untuk tetap meluncurkan skrip menggunakan. ./<script name>
tanpa menutup shell saat ini. Tetapi Anda perlu menggunakanreturn
untuk keluar dari fungsi saja atau skrip bersumber (skrip berlari menggunakan. ./<scriptname>
sintaks).sumber
return
TIDAK akan menghentikan file skripexit
/return
dalam fungsi akan tidak disebut sementara sumber file yang diberikan), sesi shell akan mengakhiri (bersama-sama dengan terminal) jika fungsi yang digunakanexit
. Denganreturn
, itu akan menangani kontrol kembali ke shell panggilan. Perhatikan bahwa jika Anda ingin kembali dari skrip bersumber (yang ini bukan tentang),return
adalah cara yang benar untuk melakukannya juga karenaexit
akan mengakhiri sesi shell.Satu-satunya cara agar skrip yang diberikan dapat menghentikan sesi shell (dan karenanya terminal) adalah dengan Anda mengambil skrip (untuk menginstal
installZook
fungsi dalam sesi shell saat ini), dan kemudian menjalankan fungsi di shell.Jika yang Anda tunjukkan hanyalah sebagian dari skrip yang lebih besar yang berisi panggilan ke
installZook
fungsi, maka fungsi tersebut masih dapat menyebabkan terminal berhenti jika skrip tersebut bersumber , tetapi tidak melalui dijalankan sebagai skrip shell biasa.exit
mengakhiri sesi shell saat ini. Ketika fungsi dijalankan,exit
akan mengakhiri shell yang memanggilnya.return
kembali dari suatu fungsi (atau file skrip bersumber). Jika fungsinya, alih-alihexit
, digunakanreturn
, itu akan mengembalikan kontrol ke lingkungan pemanggilan (mungkin shell interaktif tempat Anda memanggil fungsi) tanpa keluar.Jika Anda menjalankan
installZook
fungsi secara manual dari shell, maka yang harus Anda lakukan adalah mengubahexit
toreturn
. Jika ada potongan kode lain dalam skrip Anda yang memanggil fungsi (dan yang tidak Anda tunjukkan), maka potongan kode tersebut perlu bereaksi tambahan terhadap status pengembalian fungsi.Sebagai contoh
Jika ini adalah bagian dari tidak ada fungsi dalam skrip, dan jika Anda mengambil skrip, itu akan mengembalikan kontrol ke shell jika fungsi mengembalikan kode keluar non-nol.
sumber
Alih-alih menggunakan
exit 1
coba gunakanreturn 1
.sumber
return
akan kembali dariInstallZook()
fungsi, bukan keluar dari skrip.