我正在尝试使用make变量来存储名称和时间戳,以便可以复制带有时间戳的其他文件内容。但是,我一直收到“ FILENAME:找不到”,并且cp命令缺少目标。
我查看了答案,但是没有运气。 output a file with a variable name in shell 在FILENAME和cp命令之前有一个换行符和制表符,但是SO没有显示它。
initial:
FILENAME = $(date +"file%F-%T.txt")
cp backup/file.txt $$(FILENAME)
答案 0 :(得分:2)
但是,我不断收到“ FILENAME:未找到”,并且cp命令缺少目标。
这并不奇怪。好吧,也许有点意外:我什至不希望make尝试执行cp
命令。
每个规则的配方应该是一系列Shell命令。特别是,make
将在扩展$(...)
部分之后将这一行解释为shell命令:
FILENAME = $(date +"file%F-%T.txt")
这不是设置变量的正确Shell语法(为此目的,不允许使用=
周围的空格),因此它将尝试执行名为“ FILENAME”的 command 。大概不会在路径中找到。 make
应该在那里报告错误,并且我希望它停止处理配方。
但是,如果继续,则您还有其他问题。将下一个配方行中的$$
加倍会使它扩展为单个$
,因此如果处理该行时将执行的shell命令将被
cp backup/file.txt $(FILENAME)
但是对于shell来说,$(...)
语法在括号内执行命令并扩展到其标准输出。因此,再次,这会尝试执行命令FILENAME
。
此外,配方的每一行都是通过单独调用shell来执行的,因此在配方的一行上设置的shell变量在其他行(在不同的shell中运行)上不可用
如果您只想要一个食谱的时间戳,那么我建议完全跳过该变量:
initial:
cp backup/file.txt "$$(date +'file%F-%T.txt')"
如果您想存储它以供重复使用,和您正在使用并且愿意依赖GNU的make
实现,那么您可以将时间戳存储在{ {1}}变量,您必须在任何规则之外执行该操作:
make
然后让TIMESTAMP = $(shell date +'file%F-%T.txt')
展开它而不是依靠shell进行扩展:
make