17

当我在 shell 上运行以下命令时,它可以正常工作。但如果我将它写在 Makefile 中并用“make”命令调用它,它就不起作用。

cp wpa_{cli,supplicant,passphrase,event} /usr/local/bin/

“make”命令后的错误:

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

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

4

3 回答 3

26

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

只需在 makefile 顶部添加一行:

SHELL=/usr/bin/bash

(请确认您的 bash 路径)。

于 2012-10-11T11:39:34.250 回答
1

正如史蒂夫 K 解释的那样,这是一种 bashism。如果你想更接近标准,你可以使用 for 循环而不会有太多麻烦。

for x in cli supplicant passphrase event; do cp -v wpa_$$x /usr/local/bin/; done

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

于 2019-12-06T18:00:39.740 回答
0

我喜欢@bk 的答案,因为它符合工具的约定,但作为参考,您也可以直接调用 bash shell 来执行一个命令来进行大括号扩展:

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

target:
    cp $(wpa_files) /usr/local/bin/
于 2021-02-11T21:27:29.913 回答