我想用时间戳创建日志文件。在我的Makefile中,我得到的日期如下:
DATE = $(shell date '+%Y-%m-%d-%H:%M:%S')在我的食谱中,我在日志文件上做了几个grep:
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小时重复此运行。
sleep 2是故意的。因为我的服务器有一些延迟,文件需要一段时间才会出现。但是,据我所知,Makefile在执行命令之前扩展了所有的菜谱。为什么$(DATE)对一个菜谱有两个值?对不起,没有提供实际的MWE,而是抽象的MWE。任何帮助都是非常感谢的。
发布于 2020-02-26 09:47:00
您需要使用:=来定义变量,而不是=。在使用=时,每次引用它时都会对其进行评估,而在使用:=时,只有在定义它时才对其进行评估,然后使用它的值。
这在GNU手册:变量的两种类型中得到了解释,其中用:=定义的变量称为simply expanded variables,用=定义的变量称为recursively expanded variables。
定义变量时,对简单展开变量的值进行一次扫描,扩展对其他变量和函数的引用。
您的Makefile就会是这样的:
DATE := $(shell date '+%Y-%m-%d-%H:%M:%S')https://stackoverflow.com/questions/60409729
复制相似问题