2016-11-26 36 views
0

我有以下makefilebash的測試,如果命令可以運行

SHELL += -eu 
GREEN=$(shell echo -e "\033[0;32m") 
RED=$(shell echo -e "\033[0;31m") 

AWS=$(shell command aws --version 2> /dev/null) 
all: prereqs 
    @echo "${GREEN} ✓ Testing our local environment for dependencies." 

prereqs: 
    ifndef "${AWS}" 
     $(error "${RED} AWS is not available please install aws-cli") 
    endif 
     "${AWS}" 

我如何改變它,這樣如果有扶養缺少展現一個更合適的錯誤,並繼續檢查?

我想:

prereqs: 
    aws --version || $(error "${RED} AWS is not available please install aws-cli") 
    @echo 

但它似乎並不奏效,我失去了什麼爲aws存在!

任何意見是非常感謝。

+0

這不是bash,它是'sh'。 Make除非被告知,否則不使用bash。糾正你的標籤。 –

+0

(也就是說,它帶有一些不符合POSIX標準的擴展名「sh」,'echo -e'不允許除[print]標準輸出://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html);特別參見APPLICATION USAGE部分,以顯示如何使用'printf'%b \ n''代替)。 –

+0

...對於一個恰當的例子(假設'/ bin/sh由bash在你的系統上以POSIX模式運行時提供),請看你的makefile在'export BASHOPTS = xpg_echo'後運行的方式如何運行* –

回答

1

你錯過了幾個知識點的有關如何make作品: -

寫這個:

SHELL += -eu 
GREEN=$(shell echo -e "\033[0;32m") 
RED=$(shell echo -e "\033[0;31m") 

AWS:=$(shell command aws --version 2> /dev/null) 
all: prereqs 
    @echo "${GREEN} ✓ Testing our local environment for dependencies." 

prereqs: 
ifndef AWS 
$(error "${RED} AWS is not available please install aws-cli") 
endif 
    @echo "${AWS}" 

,並注意差異。

我也覺得一個改進是:

SHELL += -eu 
GREEN=$(shell echo -e "\033[0;32m") 
RED=$(shell echo -e "\033[0;31m") 

AWS:=$(shell command aws --version 2> /dev/null) 
$(info ${GREEN} ✓ Testing our local environment for dependencies.) 
all: prereqs 

prereqs: 
ifndef AWS 
$(error "${RED} AWS is not available please install aws-cli") 
endif 
    @echo "${AWS}" 

也不會離開的彩色外殼的用戶。

+0

*關於保持OP的不符合POSIX標準的'echo -e'用法,vs轉換爲'printf'%b'「\ 033 [0; 32m」'或者這樣* –

+1

另外,將ifndef放在prereqs目標的上下文中是誤導性的:人們可能認爲它只在prereqs目標運行時才運行,這是不正確的,它在解析makefile時運行。我建議把它放在'info'和'all'目標之前,這樣就更清楚實際發生了什麼。 – MadScientist