2016-11-26 38 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