2016-01-06 147 views
0

我有一個Makefile這樣的:如何在makefile中獲取bash命令的退出狀態?

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

x.sh是簡單的腳本,打印數字1到10。

所以,當我運行make:

[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中比較值爲空。

我該如何獲得這項工作?另外我該如何使用.ONESHELL指令?如果出現問題,我是否可以退出製作而不是執行以下指令:exit 1

回答

0

GNU make的配方通常由/bin/sh執行,這意味着構造語法的ifeq構造不起作用。

現在壞消息:你試圖做的通常是一個壞主意。在GNU make中使用shell變量很可能會破壞你的程序。使用外殼條件會將其頸部折斷。

我會在你的情況

k: 
    ./x.sh 
    @echo Success! 

如果./x.sh失敗怎麼辦(即具有非零退出狀態),讓會自行停止。如果你迫切需要的退出狀態,我發現這是工作:

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

一些解釋:

通常make將打印它執行的每一行。該行在該行停止之前爲@。 通常,make將以非零退出狀態執行時停止。在一條線將停止之前,-

編輯:在你的代碼中的錯誤是由該行造成的 - >

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

剛剛嘗試在shell中運行它。你可以用單引號或雙引號把它括起來,但就像我說的,你試圖做的是非常「un make ly」。