Mam skrypt bash, jak poniżej, który instaluje Zookeeper, ale tylko jeśli nie jest już zainstalowany.
##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
}
W zaznaczonym wierszu <<<< here
, jeśli zookeeper jest już zainstalowany, chcę wyjść ze skryptu poniżej. Ale użycie exit
powoduje wyjście z samego terminala.
bash
shell-script
function
exit
prayagupd
źródło
źródło
return 1
zamiastexit 1
Odpowiedzi:
TL; DR
Użyj
return
zamiastexit
AND i uruchom skrypt za pomocąsource your-script.sh
aka.. your-script.sh
Pełne szczegóły
Jeśli uruchamiasz skrypt z
exit
instrukcją, musisz go uruchomić jako dziecko twojego obecnego dziecka.Jeśli uruchomisz go w bieżącej powłoce rozpoczętej przez sesję terminalową (użycie
. ./<scriptname>
dowolnejexit
spowoduje zamknięcie głównej powłoki, tej rozpoczętej wzdłuż sesji terminalowej.Gdybyś uruchomił skrypt jak
bash ./<scriptname>
(lub jakakolwiek inna powłoka zamiast bash ), wtedyexit
zatrzymałbyś swoją powłokę potomną, a nie tę używaną przez twój terminal.Jeśli skrypt ma uprawnienia do wykonywania, wykonanie go bezpośrednio bez podania nazwy powłoki spowoduje wykonanie go również w powłoce podrzędnej.
Użycie
return
zamiastexit
pozwoli ci nadal uruchamiać skrypt. ./<script name>
bez zamykania bieżącej powłoki. Ale musisz użyć,return
aby wyjść tylko z funkcji lub skryptu źródłowego (skrypt został uruchomiony przy użyciu. ./<scriptname>
składni).źródło
return
NIE zatrzyma pliku skryptuexit
/return
w funkcji nie zostanie wywołana podczas pobierania danego pliku), sesja powłoki zakończy się (wraz z terminalem), jeśli funkcja zostanie użytaexit
. Przy pomocyreturn
obsługiwałby kontrolę z powrotem do powłoki wywołującej. Zauważ, że jeśli chcesz powrócić ze skryptu źródłowego (o którym tu nie chodzi),return
to również poprawny sposób, abyexit
zakończyć sesję powłoki.Jedynym sposobem, w jaki dany skrypt jest w stanie zakończyć sesję powłoki (a tym samym terminal), jest pozyskanie skryptu (w celu zainstalowania
installZook
funkcji w bieżącej sesji powłoki), a następnie uruchomienie funkcji w powłoce.Jeśli to, co wyświetlasz, to tylko część większego skryptu zawierającego wywołanie
installZook
funkcji, wówczas funkcja może nadal powodować zakończenie terminala tylko wtedy, gdy skrypt jest pozyskiwany , ale nie może być uruchamiana jako zwykły skrypt powłoki.exit
kończy bieżącą sesję powłoki. Po uruchomieniu funkcjaexit
kończy powłokę, która ją wywołała.return
zwraca funkcję (lub pobrany plik skryptu). Jeśli funkcja zamiast tegoexit
użyjereturn
, zwróci kontrolę do środowiska wywołującego (prawdopodobnie interaktywnej powłoki, z której wywołano funkcję) bez wychodzenia z niej.Jeśli ręcznie uruchomić
installZook
funkcję z muszli, to wszystko powinno trzeba zrobić, to zmienićexit
sięreturn
. Jeśli w skrypcie znajduje się inny fragment kodu, który wywołuje funkcję (i którego nie wyświetlasz), ten fragment kodu musi dodatkowo zareagować na zwracany status funkcji.Na przykład
Jeśli to nie było częścią żadnej funkcji w skrypcie, a jeśli pozyskałeś skrypt, zwróci on kontrolę nad powłoką, jeśli funkcja zwróci niezerowy kod wyjścia.
źródło
Zamiast używać
exit 1
spróbuj użyćreturn 1
.źródło
return
powróci zInstallZook()
funkcji, nie wyjdzie ze skryptu.