c - makefile C 奇怪的 bash 命令行为

标签 c bash makefile

我正在尝试使用 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/

相关文章:

c - 指向带函数的二维数组的指针

c - 快速逐字节替换 if

bash - 如何读取 2 列文件并将每列作为 GNU 并行的配对输入传递

c++ - 将目标文件放入单独的文件夹中 GNU make

克隆 libxml2 文档

linux - Bash:在行尾查找带有尾随空格的文件

linux - 如果文件中存在,awk 管道的尾部不追加

compiler-errors - 使用GNU编译器: Multiple Target patterns时Makefile错误

makefile - 从 makefile 生成 VHDL 条件

c - 如果我们在 SMP 上的中断处理程序中休眠会发生什么