我有一个
rm
命令在 Makefile 中不起作用,但是当我将其复制到 shell 时它可以工作:
$ make clean
rm paper.{abs,blg,pdf,aux,log,bbl,out,xmpdata}
rm: cannot remove 'paper.{abs,blg,pdf,aux,log,bbl,out,xmpdata}': No such file or directory
make: *** [Makefile:8: clean] Error 1
$ rm paper.{abs,blg,pdf,aux,log,bbl,out,xmpdata}
$
什么原因会导致这种情况?文件权限似乎没问题。我尝试在文件名表达式周围使用双引号和撇号,但都不起作用。
更新:我在 Ubuntu 22.04 上运行 GNU Make 4.3
GNU Make 为 shell 运行符合 POSIX 标准的
/bin/sh
。 如果它调用用户正在使用的任何 shell,那么对于可移植性来说将是一场灾难。
您使用的
{}
形式不是符合 POSIX 的语法:POSIX 没有为 {}
定义任何特殊行为。 您正在尝试利用您的个人 shell 的非标准功能(可能是 bash
)。
您需要写出多个文件名或使用标准 POSIX 通配符,或者在 makefile 中添加一行以强制它使用 bash 而不是
/bin/sh
,例如:
SHELL := /bin/bash
请注意,您的 makefile 将无法在不存在
/bin/bash
的任何系统上正常工作。