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 exit
sai do próprio terminal.
Responder1
DR
Use return
em vez de exit
E execute seu script com source your-script.sh
aka.. your-script.sh
Detalhes completos
Se estiver iniciando um script com uma exit
instruçã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 exit
fechará 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 exit
teria 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 return
em vez de exit
permitirá que você ainda inicie seu script . ./<script name>
sem fechar o shell atual. Mas você precisa usar return
para 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 1
tente 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 installZook
funçã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 installZook
funçã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.
exit
encerra a sessão shell atual. Quando a função é executada, exit
ela encerra o shell que a chamou.
return
retorna 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 installZook
função a partir do shell, tudo o que você precisará fazer é alterar o exit
arquivo 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.