Bash 在makefile中使用花括号进行变量扩展不会';行不通

Bash 在makefile中使用花括号进行变量扩展不会';行不通,bash,shell,makefile,ubuntu-12.04,Bash,Shell,Makefile,Ubuntu 12.04,当我在shell上运行下面的命令时,它工作正常。但是如果我把它写在一个Makefile中,并用“make”命令调用它,它就不起作用了 cp wpa{cli,请求者,密码短语,事件}/usr/local/bin/ “make”命令后出错: cp:无法统计'wpa{cli,requlicant,passphrase,event}':没有这样的文件 或目录 我能做些什么使它与Makefile一起工作?我使用Ubuntu 12.04。相同的Makefile也适用于其他linux发行版。Make默认使用老

当我在shell上运行下面的命令时,它工作正常。但是如果我把它写在一个Makefile中,并用“make”命令调用它,它就不起作用了

cp wpa{cli,请求者,密码短语,事件}/usr/local/bin/

“make”命令后出错:

cp:无法统计'wpa{cli,requlicant,passphrase,event}':没有这样的文件 或目录


我能做些什么使它与Makefile一起工作?我使用Ubuntu 12.04。相同的Makefile也适用于其他linux发行版。

Make默认使用老式的Bourne shell(/bin/sh),不支持大括号扩展。如果尚未设置,请将makefile中的SHELL变量设置为/bin/bash

只需在makefile顶部添加一行:

SHELL=/usr/bin/bash

(请确认您的bash路径)。

正如Steve K所解释的,这是一种bash主义。如果您想更严格地遵守标准,那么可以使用for循环,而无需太多麻烦

cli请求者密码短语事件中x的
;执行cp-v wpa_u$$x/usr/local/bin/;完成


与makefiles一样,将其全部放在一行上,或者使用反斜杠将其分成几行。双美元符号表示make需要将
$
传递给shell。

我喜欢@bk的答案,因为它在工具的约定范围内,但作为参考,您也可以直接调用bash shell,只需一个命令即可执行大括号扩展:

wpa_files := $(shell /bin/bash -c 'echo wpa_{cli,supplicant,passphrase,event}')

target:
    cp $(wpa_files) /usr/local/bin/

所以我们应该添加
SHELL=/bin/bash
作为第一行?