Terminalden değil bash işlevinden çık


12

Ben zookeeper yükler aşağıdaki gibi bir bash betiği var ama sadece zaten yüklü değilse.

##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
}

İşaretli satırda <<<< here, eğer zookeeper zaten kurulu ise, istediğim altındaki komut dosyasından çıkmaktır. Ancak kullanmak exitterminalin kendisinden çıkar.


1
Bu senaryoyu nasıl başlatıyorsunuz?
Benoit

2
return 1yerine kullanmakexit 1
Polym

Yanıtlar:


21

TL; DR

Komut dosyanızı aka ile çalıştırmak VE returnyerine kullanın .exitsource your-script.sh. your-script.sh

Tüm detaylar

exitİçinde bir deyim bulunan bir komut dosyasını başlatırsanız , onu geçerli çocuğunuzun alt öğesi olarak başlatmanız gerekir.

Terminal oturumunuzla başlatılmış olan geçerli kabuğun içinde başlatırsanız ( . ./<scriptname>herhangi birini kullanarak exitana kabuk kapatılır, terminal oturumunuz boyunca başlatılır.

Senaryonuzu bash ./<scriptname>(veya bash yerine başka bir kabuk ) başlatmış exitolsaydınız, terminaliniz tarafından kullanılanı değil, çocuk kabuğunuzu durdururdunuz.

Komut dosyanız yürütülebilir izinlere sahipse, kabuğun adını vermeden doğrudan yürütmek, alt kabukta da yürütür.

returnBunun yerine kullanmak , geçerli kabuğu kapatmadan exitkomut dosyanızı başlatmanıza izin verir . ./<script name>. Ancak return, yalnızca bir işlevden veya kaynaklı bir komut dosyasından (komut dizisi . ./<scriptname>sözdizimini kullanarak çalıştırılır ) çıkmak için kullanmanız gerekir .


returnkomut dosyasını durdurmayacak
Nam G VU

@NamGVU Çıkmak yerine geri dönmek, yapılacak doğru şeydir. (Bunlar işlev çağrısı dosyayı kaynak ve varsayarsak exit/ returnolur işlevi olmayan fonksiyonu kullanıldığında belirli bir dosya kaynak sırasında adlandırılabilir), kabuk oturum (terminal ile birlikte) kesintiye uğrayacaktır exit. İle return, kontrolü çağrı kabuğuna geri işleyecekti. Kaynaklanmış bir komut dosyasından (bununla ilgili olmayan) geri dönmek istiyorsanız, returnbunu exitkabuk oturumunu sonlandıracak şekilde yapmanın doğru yolu olduğunu unutmayın .
Kusalananda

Komut dosyasını ilk etapta nasıl çalıştırdığınıza bağlıdır
Nam G VU

@NamGVU Dosyadaki işleve çağrı yok. Dosyayı kaynaklandırmak veya çalıştırmak işlevi çağırmaz. İşlevin kabuk oturumunu ve terminalini önce dosyayı kaynaklayıp sonra terminalde çağırarak başka bir yolla nasıl sonlandırdığını açıklayın.
Kusalananda

Paylaşım için teşekkürler. Sanırım konudan çok uzağa gitmeyiz.
Nam G VU

1

Verilen komut dosyasının kabuk oturumunu (ve dolayısıyla terminali) sonlandırabilmesinin tek yolu komut dosyasını kaynaklamak ( installZookişlevi geçerli kabuk oturumuna yüklemek için ) ve sonra işlevi kabukta çalıştırmaktır.

Gösterdiğiniz şey, daha büyük bir komut dosyasının installZookişleve çağrı içeren yalnızca bir bölümü ise , işlev yine de yalnızca komut dosyası kaynaklanırsa terminalin sonlandırılmasına neden olabilir , ancak sıradan bir kabuk komut dosyası olarak çalıştırılamaz.

exitgeçerli kabuk oturumunu sonlandırır. İşlev yürütüldüğünde exit, çağıran kabuğu sonlandırır.

returnbir işlevden (veya kaynaklı bir komut dosyasından) döner. Eğer işlev exitkullanılırsa, kullanılmadan returnkontrolü çağıran ortama döndürür (muhtemelen işlevi çağırdığınız etkileşimli kabuk).

El çalıştırırsanız installZookkabuğundan işlevini sonra tüm yapmanız gereken gerektiğini değiştirmektir exitiçin return. Komut dosyanızda işlevi çağıran (ve göstermediğiniz) başka bir kod parçası varsa, bu kod parçasının ek olarak işlevin dönüş durumuna tepki vermesi gerekir.

Örneğin

installZook || return

Bu, komut dosyasında hiçbir işlevin bir parçası değilse ve komut dosyasını kaynakladıysanız, işlev sıfır olmayan bir çıkış kodu döndürürse, kabuğu kabuğa döndürür.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.