首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >制作食谱中的日期

制作食谱中的日期
EN

Stack Overflow用户
提问于 2020-02-26 08:34:48
回答 1查看 434关注 0票数 1

我想用时间戳创建日志文件。在我的Makefile中,我得到的日期如下:

代码语言:javascript
复制
DATE                = $(shell date '+%Y-%m-%d-%H:%M:%S')

在我的食谱中,我在日志文件上做了几个grep:

代码语言:javascript
复制
my_long_run: 
cd $(MYDIR); Running a tool for a long time | tee -i ./Log/my_long_run_log.$(DATE)
@sleep 2
@grep -iq "Status of the Job:0" Log/my_long_run_log.$(DATE)
@if [ ! -z "$(SOME_ENV_VAR)" ]; then ln -fs $(ANOTHER_ENV_VAR)/my_generate_file; fi; \
echo "$$dependencyTree" > $@; \
echo -e "\nWarning Summary:" >> $@; \
if grep -iq "warn.*total" Log/my_long_run_log.$(DATE)  ; then grep -i "warn.*total" Log/my_long_run_log.$(DATE) >> $@;  fi; \
if grep -iq "warn.*check" Log/my_long_run_log.$(DATE) ; then grep -i "warn.*check" Log/my_long_run_log.$(DATE) >> $@; fi; \
echo -e "\nError Summary:" >> $@; \
if grep -iq "error.*total" Log/my_long_run_log.$(DATE) ; then grep -i "error.*total" Log/my_long_run_log.$(DATE) >> $@; fi; \
if grep -iq "error.*check" Log/my_long_run_log.$(DATE) ; then grep -i "error.*check" Log/my_long_run_log.$(DATE) >> $@; fi;

问题是:在第一行中,日期展开为: 2020-02-26-09:14:09.但是grep命令查找一个带有时间戳的文件: 2020-02-26-09:14:10 grep: Log/ my_long_run _log.2020-02-26-09:14:10:没有这样的文件或目录gmake:*my_long_run错误2。当然,由于grep失败,我需要在运行时6-7小时重复此运行。

代码语言:javascript
复制
sleep 2

是故意的。因为我的服务器有一些延迟,文件需要一段时间才会出现。但是,据我所知,Makefile在执行命令之前扩展了所有的菜谱。为什么$(DATE)对一个菜谱有两个值?对不起,没有提供实际的MWE,而是抽象的MWE。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-26 09:47:00

您需要使用:=来定义变量,而不是=。在使用=时,每次引用它时都会对其进行评估,而在使用:=时,只有在定义它时才对其进行评估,然后使用它的值。

这在GNU手册:变量的两种类型中得到了解释,其中用:=定义的变量称为simply expanded variables,用=定义的变量称为recursively expanded variables

定义变量时,对简单展开变量的值进行一次扫描,扩展对其他变量和函数的引用。

您的Makefile就会是这样的:

代码语言:javascript
复制
DATE := $(shell date '+%Y-%m-%d-%H:%M:%S')
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60409729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档