我正在尝试使用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编写的命令不起作用?
答案 0 :(得分:3)
您在终端中正在运行bash
。 make
正在通过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
我承认,如果您的文件名可能包含空格,那么效果不会很好。