У меня есть скрипт bash, как показано ниже, который устанавливает zookeeper, но только если он еще не установлен.
##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
}
В отмеченной строке <<<< here
, если zookeeper уже установлен, я хочу выйти из скрипта под ним. Но используя exit
выход из самого терминала.
bash
shell-script
function
exit
prayagupd
источник
источник
return 1
вместоexit 1
Ответы:
TL; DR
Используйте
return
вместоexit
AND запускать ваш скрипт с помощьюsource your-script.sh
aka.. your-script.sh
Полная информация
Если вы запускаете скрипт с
exit
утверждением в нем, вы должны запускать его как дочерний элемент вашего текущего дочернего элемента.Если вы запустите его внутри текущей оболочки, запущенной с вашего терминального сеанса (использование
. ./<scriptname>
любогоexit
закроет основную оболочку, тот, который начался вместе с вашим терминальным сеансом).Если бы вы запустили свой скрипт как
bash ./<scriptname>
(или любую другую оболочку вместо bash ), тоexit
остановили бы вашу дочернюю оболочку, а не ту, которая используется вашим терминалом.Если у вашего скрипта есть права на выполнение, выполнение его напрямую, без указания имени оболочки, выполнит его и в дочерней оболочке.
Использование
return
вместоexit
позволит вам по-прежнему запускать сценарий, используя,. ./<script name>
не закрывая текущую оболочку. Но вам нужно использоватьreturn
для выхода только из функции или источника сценария (сценарий выполняется с использованием. ./<scriptname>
синтаксиса).источник
return
НЕ будет останавливать файл сценарияexit
/return
в функции не будет вызываться при поиске данного файла), сеанс оболочки завершится (вместе с терминалом), если будет использована функцияexit
. С помощьюreturn
он будет обрабатывать управление обратно к вызывающей оболочке. Обратите внимание, что если вы хотите вернуться из исходного сценария (о котором речь не идет),return
это правильный способ сделать это, так какexit
это завершит сеанс оболочки.Единственный способ, которым данный сценарий может прекратить сеанс оболочки (и, следовательно, терминал), состоит в том, что вы запрашиваете сценарий (для установки
installZook
функции в текущем сеансе оболочки), а затем запускаете функцию в оболочке.Если то, что вы показываете, является только частью более крупного сценария, содержащего вызов
installZook
функции, то функция все равно может вызвать завершение работы терминала только в том случае, если сценарий получен , но не из-за запуска в качестве обычного сценария оболочки.exit
завершает текущий сеанс оболочки. Когда функция выполняется,exit
она завершает оболочку, вызвавшую ее.return
возвращается из функции (или файла сценария с источником). Если бы вместоexit
используемой функцииreturn
она возвращала управление вызывающей среде (возможно, интерактивной оболочке, из которой вы вызвали функцию), не выходя из нее.Если вручную запустить
installZook
функцию из оболочки, то все , что вам нужно нужно сделать , это изменитьexit
кreturn
. Если в вашем скрипте есть другой фрагмент кода, который вызывает функцию (и которую вы не показываете), то этот фрагмент кода должен дополнительно отреагировать на состояние возврата функции.Например
Если это не было частью функции в сценарии, и если вы использовали сценарий, он вернул бы управление оболочке, если функция вернула ненулевой код завершения.
источник
Вместо использования
exit 1
попробуйте использоватьreturn 1
.источник
return
вернется изInstallZook()
функции, а не выйдет из скрипта.