2016-12-15 4 views
0

спутать об этом на некоторое время, вот дистиллированная скрипт, который представляет собой проблему:Bash сценарий продолжается, даже если я хочу, чтобы выйти раньше

#start  
# note that master does not exist, so this should fail, would like to exit on the next line 
git branch -D master || (echo "no master branch" && exit 1); 
git fetch origin && 
git checkout master && 

BRANCH=$(git rev-parse --abbrev-ref HEAD) 
if [[ "$BRANCH" != "master" ]]; then 
    echo 'Aborting script because you are not on the right git branch (master).'; 
    exit 1; 
fi 

echo "done" 
#end 

когда я бегу выше сценарий, я получаю этот выход :

error: branch 'master' not found. 
no master branch 
error: Your local changes to the following files would be overwritten by checkout: 
     publish-to-NPM.sh 
Please, commit your changes or stash them before you can switch branches. 
Aborting 
Aborting script because you are not on the right git branch (master). 

Обратите внимание, что «сделано» не получает вторит, поэтому скрипт делает выход на второй выход 1 вызов. Но почему сценарий не выходит из первого вызова выхода 1? Так запутался.

+1

похоже, что это может ответить на вопрос - http://stackoverflow.com/questions/3822621/how-to-exit-if-a-command-failed –

ответ

4
git branch -D master || (echo "no master branch" && exit 1); 

эксплуатирует RHS условного в среде подпроцесса. Выход завершает этот подпроцесс. Если вы хотите выйти из основного сценария, не запускайте его в подпроцессе. То есть, напишите:

git branch -D master || { echo "no master branch" && exit 1; } 
+0

спасибо за объяснение относительно подпроцесса! –

+0

Согласен, но только для того, чтобы быть понятным, это не так. Done не печатает. –

0

Ну конечно, вы вызываете exit в условии if, которое стреляет.

Выход завершает текущий процесс на любом языке, включая bash (хотя, если вы нанизаны или разветвляетесь, он становится более сложным, но это не похоже, что вы одновременно выполняете что-либо).

+0

Дэн взгляните на принятый ответ в ссылке в первом комментарии к OP, а также ответ @ blitzen9872 –

+0

Это действительно очень похоже на то, re и ошибки программирования bash, @AlexanderMills. –

 Смежные вопросы

  • Нет связанных вопросов^_^