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

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

Eu tenho um script bash abaixo que instala o zookeeper, mas somente se ainda 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 <<<< here, se o zookeeper já estiver instalado, o que eu quero é sair do script abaixo dele. Mas usar exitsai do próprio terminal.

Responder1

DR

Use returnem vez de exitE execute seu script com source your-script.shaka.. your-script.sh

Detalhes completos

Se estiver iniciando um script com uma exitinstrução, você deverá iniciá-lo como filho do seu filho atual.

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

Se você tivesse iniciado seu script como bash ./<scriptname>(ou qualquer outro shell em vez defesta), então exitteria interrompido seu shell filho e não aquele usado pelo seu terminal.

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 returnem vez de exitpermitirá que você ainda inicie seu script . ./<script name>sem fechar o shell atual. Mas você precisa usar returnpara sair apenas de uma função ou de um script de origem (o script foi executado usando a . ./<scriptname>sintaxe).

Responder2

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

Responder3

A única maneira de o script fornecido ser capaz de encerrar a sessão do shell (e, portanto, o terminal) é fornecendo o script (para instalar a installZookfunção na sessão do shell atual) e, em seguida, executando a função no shell.

Se o que você está mostrando é apenas uma parte de um script maior contendo uma chamada para a installZookfunção, então a função ainda só poderá fazer com que o terminal seja encerrado se o script fororiginado, mas não sendo executado como um script de shell comum.

exitencerra a sessão shell atual. Quando a função é executada, exitela encerra o shell que a chamou.

returnretorna de uma função (ou de um arquivo de script de origem). Se a função, em vez de exit, fosse usada return, ela retornaria o controle para o ambiente de chamada (provavelmente o shell interativo do qual você chamou a função) sem sair dele.

Se você executar manualmente a installZookfunção a partir do shell, tudo o que você precisará fazer é alterar o exitarquivo para return. Se houver outro trecho de código em seu script que chama a função (e que você não está mostrando), então esse trecho de código precisaadicionalmentereagir ao status de retorno da função.

Por exemplo

installZook || return

Se isso não fizesse parte de nenhuma função no script e se você originasse o script, ele retornaria o controle ao shell se a função retornasse um código de saída diferente de zero.

informação relacionada