如何在makefile中创建一个包含文本文件名和时间戳的变量?

时间:2019-06-10 20:11:06

标签: shell makefile

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

1 个答案:

答案 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