我正在尝试使用 clean 创建 makefile 文件。
我的 clean 看起来像(它应该删除除 *.c 源文件之外的位置中的所有内容)。
clean:
rm !(*.c)
当我尝试在终端中执行 make clean
时,我得到
User 1# make clean
rm !(*.c)
/bin/sh: 1: Syntax error: "(" unexpected
make: *** [clean] Error 2
但是当我在终端中输入 rm !(*.c)
时,它工作正常。
为什么makefile中写的命令不起作用?
最佳答案
您正在运行bash
在您的终端中。 make
正在通过默认 SHELL
运行该配方行这是 /bin/sh
.
您可以设置SHELL := /bin/bash
在您的 makefile 中为 make 选择不同的 shell 来执行其配方行,或者您可以手动运行 bash -c 'rm !(*.c)'
作为您的配方行,或者您可以使用不同的方法来选择要清理的文件。
评论更新(感谢@chepner):
extglob
必须为 !(*.c)
启用要使用的。还必须在解析使用它的行之前设置它(因此 bash -c 'shopt -s extglob; rm !(*.c)'
不起作用)。
因此,可用选项是使用 bash -O extglob -c 'rm !(*.c)'
(这可能是最好的答案)设置 SHELL := bash -O extglob
(在 make 3.81 中有效,但对于较新版本的 make 需要以不同的方式完成)或使用heredoc。
bash <<EOF
shopt -s extglob
rm !(*.c)
EOF
虽然我不相信在 makefile 配方中可以使用heredoc选项。
关于c - makefile C 奇怪的 bash 命令行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26874900/