Keluar dari fungsi bash, bukan terminal

12

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 exitkeluar dari terminal itu sendiri.

prayagupd
sumber
1
Bagaimana Anda meluncurkan skrip ini?
Benoit
2
gunakan return 1sebagai gantiexit 1
polym

Jawaban:

21

TL; DR

Gunakan returnalih-alih exitDAN jalankan skrip Anda dengan source your-script.shalias.. your-script.sh

Detail lengkap

Jika meluncurkan skrip dengan exitpernyataan 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 pun exitakan menutup shell utama, yang dimulai sepanjang sesi terminal Anda.

Jika Anda telah meluncurkan skrip Anda seperti bash ./<scriptname>(atau shell lain alih-alih bash ), maka exitakan 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 returnbukan exitakan memungkinkan Anda untuk tetap meluncurkan skrip menggunakan . ./<script name>tanpa menutup shell saat ini. Tetapi Anda perlu menggunakan returnuntuk keluar dari fungsi saja atau skrip bersumber (skrip berlari menggunakan . ./<scriptname>sintaks).

Benoit
sumber
returnTIDAK akan menghentikan file skrip
Nam G VU
@NamGVU Kembali daripada keluar adalah hal yang benar untuk dilakukan. Dengan asumsi bahwa mereka sumber file dan kemudian memanggil fungsi (yang exit/ returndalam fungsi akan tidak disebut sementara sumber file yang diberikan), sesi shell akan mengakhiri (bersama-sama dengan terminal) jika fungsi yang digunakan exit. Dengan return, itu akan menangani kontrol kembali ke shell panggilan. Perhatikan bahwa jika Anda ingin kembali dari skrip bersumber (yang ini bukan tentang), returnadalah cara yang benar untuk melakukannya juga karena exitakan mengakhiri sesi shell.
Kusalananda
Itu tergantung pada bagaimana Anda menjalankan skrip di tempat pertama
Nam G VU
@NamGVU Tidak ada panggilan ke fungsi dalam file. Hanya sumber atau menjalankan file tidak akan memanggil fungsi. Jelaskan bagaimana fungsi mengakhiri sesi shell dan terminal dengan cara apa pun selain dengan sumber pertama file dan kemudian memanggilnya di terminal.
Kusalananda
Thanjs untuk berbagi. Saya pikir kita tidak akan terlalu jauh dari topik itu.
Nam G VU
1

Satu-satunya cara agar skrip yang diberikan dapat menghentikan sesi shell (dan karenanya terminal) adalah dengan Anda mengambil skrip (untuk menginstal installZookfungsi 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 installZookfungsi, maka fungsi tersebut masih dapat menyebabkan terminal berhenti jika skrip tersebut bersumber , tetapi tidak melalui dijalankan sebagai skrip shell biasa.

exitmengakhiri sesi shell saat ini. Ketika fungsi dijalankan, exitakan mengakhiri shell yang memanggilnya.

returnkembali dari suatu fungsi (atau file skrip bersumber). Jika fungsinya, alih-alih exit, digunakan return, itu akan mengembalikan kontrol ke lingkungan pemanggilan (mungkin shell interaktif tempat Anda memanggil fungsi) tanpa keluar.

Jika Anda menjalankan installZookfungsi secara manual dari shell, maka yang harus Anda lakukan adalah mengubah exitto return. 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

installZook || return

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.

Kusalananda
sumber
0

Alih-alih menggunakan exit 1coba gunakan return 1.

ryekayo
sumber
1
returnakan kembali dari InstallZook()fungsi, bukan keluar dari skrip.
Barmar
@Barmar Lihat komentar di atas .
Kusalananda