2016-01-06 3 views
0

У меня есть Makefile так:Как получить статус выхода команды bash в make-файле?

k: 
     status=$(shell ./x.sh;echo $?) 
     ifeq ($(status),0) 
        echo success 
     else 
        echo failure 
        exit 1 
     endif 

x.sh простой скрипт, который печатает цифры от 1 до 10.

Так что, когда я выполняю макияж:

[email protected]:$make k 
status=1 2 3 4 5 6 7 8 9 10 
/bin/sh: 1: 2: not found 
Makefile:2: recipe for target 'k' failed 
make: *** [k] Error 127 

Здесь я получаю выход вместо $?. И когда я сравниваю в ifeqstatus значение равно null.

Как я могу получить эту работу? Также как я могу использовать директиву .ONESHELL? Могу ли я действительно выйти из make, если что-то пойдет не так, а вместо выполнения следующих инструкций с exit 1?

ответ

0

Рецепт создания GNU обычно выполняется /bin/sh, что означает, что конструкция ifeq, которая является синтаксисом make, не работает.

Теперь плохая новость: то, что вы пытаетесь сделать, - это, как правило, плохая идея. Использование переменных оболочки внутри GNU make, скорее всего, нарушит вашу программу. Использование условных условных обозначений обрезает шею.

Что я буду делать в вашем случае

k: 
    ./x.sh 
    @echo Success! 

Если ./x.sh не удается (т.е. имеет статус ненулевого выходной), сделать остановятся сам по себе. Если вы отчаянно нуждаетесь в статусе выхода, я нашел, что это будет работать:

k: 
    -./x.sh 
    @echo [email protected] 

Некоторые пояснения:

Обычно make печатает каждую строку, она выполняет. @ до того, как эта линия остановит это. Обычно make останавливается, если он выполняется с ненулевым статусом выхода. - перед тем, как линия остановит это.

EDIT: Ошибка в коде обусловлено тем, что линии ->

status=1 2 3 4 5 6 7 8 9 10 

Просто попробуйте запустить его в оболочку. Вы можете заключить его в одиночные или двойные кавычки, но, как я уже сказал, вы пытаетесь сделать очень «un make ly».

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