【问题标题】:How to log time stamp in Makefile before every line executes under target如何在每行在目标下执行之前在 Makefile 中记录时间戳
【发布时间】:2022-12-18 11:52:05
【问题描述】:

我的 make 文件目标有几个步骤。下面的例子

do-something:
    cat Dockerfile
    ls

我想在调用命令之前显示时间戳。我喜欢下面。有没有更好更简洁的方法?

do-something:
    echo $(shell date -u +'%d-%m-%Y %H:%M:%S:%N') calling step1
    cat Dockerfile
    echo $(shell date -u +'%d-%m-%Y %H:%M:%S:%N') calling step2
    ls
    echo $(shell date -u +'%d-%m-%Y %H:%M:%S:%N') Done

回答:

我可以使用以下答案构建我的解决方案。

logLine = @date -u +'%d-%m-%Y %H:%M:%S:%N $1'

do-something:
    $(call logLine, calling step1)
    sleep 3
    @date -u +'%d-%m-%Y %H:%M:%S:%N calling step2'
    sleep 4
    $(call logLine, Done)

【问题讨论】:

  • 你能解释一下为什么你使用shellmake函数来调用date而不是调用catls吗?您在激发此动机的这 3 个命令之间有什么本质区别?
  • catls 不是目标下的实际步骤。它们仅用作示例。这有帮助吗?
  • 不,不是真的,我仍然不明白为什么,虽然您显然知道 make 食谱已经是 shell 脚本(否则您不会在食谱中调用 catls),但您决定使用 $(shell ...) 来调用另一个命令。我猜想,在命令行上,您调用 date 的方式与调用 catls 的方式不同,对吗?由于这很常见,我真的很想了解,这里可能有一些值得关注的地方,这可能有助于改进我们关于 make 的答案。
  • 对,我在 make target 下调用 shell 命令。我的目标是在调用 shell 命令之前添加一些以时间戳为前缀的消息。有没有办法避免在我的echo行中重复$(shell date -u +'%d-%m-%Y %H:%M:%S:%N')
  • 首先,您可以简单地使用 date -u +'%d-%m-%Y %H:%M:%S:%N calling step1' 而不是不太简洁的 echo $(shell date ...)。你为什么使用$(shell ...)是我的主要问题。其次,如果您询问 make 是否具有可以自动执行此操作的选项或其他功能,那么没有,没有 make 选项可以为您执行此操作。但是您可以使用 make 宏来简化一点,请参阅我的回答。

标签: makefile


【解决方案1】:

在 make 配方中使用 $(shell ...) 几乎总是错误的,因为 make 配方已经是 shell 脚本并且因为 $(shell ...) 被 make 扩展的时间。

相反,您可以简单地使用:

do-something:
    date -u +'%d-%m-%Y %H:%M:%S:%N calling step1'
    cat Dockerfile
    date -u +'%d-%m-%Y %H:%M:%S:%N calling step2'
    ls
    date -u +'%d-%m-%Y %H:%M:%S:%N Done'

为了简化一点,您可以定义一个宏:

date = date -u +'%d-%m-%Y %H:%M:%S:%N $1'

do-something:
    $(call date,calling step1)
    cat Dockerfile
    $(call date,calling step2)
    ls
    $(call date,Done)

【讨论】:

  • 非常感谢,这有效。我可以添加 @date 以避免在终端上打印命令。 ``` logLine = @date -u +'%d-%m-%Y %H:%M:%S:%N $1' do-something: $(call logLine, calling step1) sleep 3 @date -u +'%d-%m-%Y %H:%M:%S:%N 调用 step2' sleep 4 $(call logLine, Done) ```
【解决方案2】:

有没有更好更简洁的方法?

是的,你不需要(而且真的不应该)在解析 makefile 时调用 shell(这是 $(shell ...) 所做的):

do-something:
    date -u +'%d-%m-%Y %H:%M:%S:%N'
    cat Dockerfile
    date -u +'%d-%m-%Y %H:%M:%S:%N'
    ls
    date -u +'%d-%m-%Y %H:%M:%S:%N'

此外,您可以在变量中使用 date 命令:

ECHO_TIMESTAMP := date -u +'%d-%m-%Y %H:%M:%S:%N'

do-something:
    $(ECHO_TIMESTAMP)
    cat Dockerfile
    $(ECHO_TIMESTAMP)
    ls
    $(ECHO_TIMESTAMP)

【讨论】:

  • 对不起,我必须编辑我的问题!你的回答有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2023-03-10
  • 2010-10-11
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多