2016-12-22 2 views
0

У меня есть следующий фрагмент кода работает таким образом, что мой Баш скрипт выходит рано отказчтение кода возврата из сценария bash в сценарий bash?

./gradlew clean build release 
if [ $? -eq 0 ] 
then 
    echo "Successfully BUILT FAKE RELEASE" 
else 
    echo "BUILDING FAKE RELEASE FAILED" 
    exit $? 
fi 

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

./runAllTesting.sh 
if [ $? -eq 0 ] 
then 
    echo "Successfully RAN ALL TESTING" 
else 
    echo "TESTING SYSTEM Failed(don't release this)" 
    exit $? 
fi 

Что я здесь делаю неправильно? Это на компьютере 10.11.6 el capitan mac.

+5

Я думаю, что '$? ' в параметре 'exit' всегда будет возвращать успех, потому что перед ним команда' echo', которая всегда будет успешной –

+0

oh crap, lol, duh me. @KoCour –

ответ

2

мой сценарий, который называет это продолжается

Да, вы должны проверить код завершения вашего сниппета в вызывающем скрипте, а затем вести себя соответствующим образом

if ! ./posted_snippet.sh; then 
    exit 
fi 

Таким образом, верхний уровень выходит, но теряет информацию об ошибке который заставил его выйти. Это часто не имеет значения, потому что сообщения об ошибках от posted_snippet.sh уточнят, какой тест не удалось и почему. Однако, если код ошибки должен быть передан на верхний уровень, можно было бы использовать сжатую форму

./posted_snippet.sh || exit $? 

что намного лучше, чем if ./posted_snippet.sh; then :; else exit $?; fi.

Важно, чтобы posted_snippet.sh должен был выйти с правильным кодом, и в комментариях он уже указывал, что это не так. Ваш последний $? захватывает код выхода echo, который всегда равен 0. Вот рабочая версия:

./runAllTesting.sh 
test_result=$? 
if [ $test_result -eq 0 ]; then 
    echo "Successfully RAN ALL TESTING" 
else 
    echo "TESTING SYSTEM Failed(don't release this)" 
    exit $test_result 
fi 
2

$? означает, что статус выхода последней команды, которая была выполнена. Последняя команда, которая была выполнена, - echo "TESTING SYSTEM Failed(don't release this)", и она успешно работала. То, что вы действительно делали после этого эха, было exit 0. Чтобы обойти эту проблему, чтобы сохранить $? в переменной

./gradlew clean build release 
readonly status=$? 
if [[ $status -eq 0 ]];then 
    echo "Successfully BUILT FAKE RELEASE" 
else 
    echo "BUILDING FAKE RELEASE FAILED" 
    exit $status 
fi 

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

+0

Почему 'readonly'? –

+0

, так что значение не может быть перезаписано –

+0

Перезаписано кем? –

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