gpt4 book ai didi

shell - 在 makefile 中的每个目标之前和之后运行

转载 作者:行者123 更新时间:2023-12-04 13:22:19 26 4
gpt4 key购买 nike

我想在 makefile 中的每个目标之前和之后运行一个命令。

像这样

pre:
@echo pre
@echo running | mailx -s "Start {target}" user@foo.com
post:
@echo post
@echo post | mailx -s "Finish {target}" user@foo.com
j:
long_running_command && echo $@ > $@
k: j
long_running_command2 && echo $@ > $@

我想为 j 和 k 运行 pre 和 post。理想情况下,我希望收到有关开始和停止的每个任务的电子邮件。

最佳答案

一种方法是修改您的 makefile 中的所有配方以调用某些命令。您可以将它放入一个变量中,这样它看起来就不会太恶心了:

START = mailto --subject 'Started target $@' me@my.host
END = mailto --subject 'Finished target $@' me@my.host

j:
$(START)
long_running_command && echo $@ > $@
$(END)
k: j
$(START)
long_running_command2 && echo $@ > $@
$(END)

这样做的好处是您可以挑选并选择您想要的目标;也许他们中的一些人不需要它。缺点是如果命令失败,您根本不会收到任何“结束”电子邮件。

如果你真的想为每个目标都这样做,那么你可以编写一个 shell 脚本来模仿 shell 的行为,但也可以在运行命令时发送邮件。

$ cat mailshell
#!/bin/sh
# get rid of the -c flag
shift
mailto --subject "started $*" me@my.host
/bin/sh -c "$@"
r=$?
mailto --subject "ended $* with exit code $r" me@my.host
exit $r

(请注意,这完全未经测试,但我希望你能理解)。然后在您的 makefile 中,将 SHELL 设置为该 shell:

SHELL := mailshell

j:
long_running_command && echo $@ > $@
k: j
long_running_command2 && echo $@ > $@

我想您仍然可以通过将 SHELL 设置为特定于目标的变量来进行选择,仅针对那些您想要使用 shell 的目标。

这样做的一个缺点是,如果您的食谱有多行,您将分别收到一封针对每一行的电子邮件。您可以通过启用 .ONESHELL: 强制将整个配方传递给单个 shell 来解决此问题。但是,我认为这可能需要您的 mailshell 工具更加复杂。

关于shell - 在 makefile 中的每个目标之前和之后运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49163484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com