makefile C奇怪的bash命令行为

时间:2014-11-11 21:27:09

标签: c bash makefile

我正在尝试使用clean创建makefile文件。

我的干净看起来(除了* .c源文件之外,它应该从位置删除enything)。

clean:
    rm !(*.c)

当我尝试在终端中执行make clean时,我得

User 1# make clean
rm !(*.c)
/bin/sh: 1: Syntax error: "(" unexpected
make: *** [clean] Error 2

但是当我在终端中键入rm !(*.c)时,它可以正常工作。

为什么用makefile编写的命令不起作用?

2 个答案:

答案 0 :(得分:3)

您在终端中正在运行bashmake正在通过SHELL的默认/bin/sh运行该配方行。

您可以在makefile中设置SHELL := /bin/bash以选择一个不同的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选项。

答案 1 :(得分:1)

最好只使用便携式外壳,而不是尝试使用特殊于鞋子的bash特性:

ls -1 | grep -v '\.c$' | xargs rm -f

我承认,如果您的文件名可能包含空格,那么效果不会很好。