Sair da função bash, não do terminal

6

Eu tenho um script bash como abaixo, que instala o zookeeper, mas somente se não estiver instalado.

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

Na linha marcada com <<<< here , se o zookeeper já estiver instalado, o que eu quero é sair do script abaixo dele. Mas usar exit sai do próprio terminal.

    
por prayagupd 23.06.2014 / 15:36

2 respostas

9

Se você iniciar um script com uma instrução exit , será necessário iniciá-lo como filho de seu filho atual.

Se você iniciá-lo dentro do shell atual de iniciado com sua sessão de terminal (usando . ./<scriptname> any exit fechará o shell principal, aquele iniciado ao longo de sua sessão de terminal.

Se você tivesse lançado seu script como bash ./<scriptname> (ou qualquer outro shell em vez de bash ), então exit teria parado seu shell filho e não o usado pelo seu terminal. / p>

Se o seu script tiver permissões executáveis, executá-lo diretamente sem fornecer o nome do shell também o executará em um shell filho.

Usar return em vez de exit permitirá que você ainda lance seu script usando . ./<script name> sem fechar o shell atual. Mas você precisa usar return para sair de uma função apenas ou de um script de origem (o script foi executado usando a sintaxe . ./<scriptname> ).

    
por 23.06.2014 / 15:49
0

Em vez de usar exit 1 , tente usar return 1 .

    
por 23.06.2014 / 15:38