抑制makefile中命令调用的回声?

Posted

技术标签:

【中文标题】抑制makefile中命令调用的回声?【英文标题】:Suppress echo of command invocation in makefile? 【发布时间】:2012-04-15 13:30:43 【问题描述】:

我为一个作业编写了一个程序,该程序应该将其输出打印到标准输出。分配规范需要创建一个 Makefile,当作为 make run > outputFile 调用时,它应该运行程序并将输出写入一个文件,该文件具有与规范中给出的相同的 SHA1 指纹。

我的问题是我的makefile:

...
run:
     java myprogram

还将运行我的程序(例如 java myprogram)的命令打印到输出文件,以便我的文件包含导致指纹错误的额外行。

有没有什么方法可以在命令调用不回显到命令行的情况下执行命令?

【问题讨论】:

【参考方案1】:

在命令开头添加@ 告诉gmake 不要打印正在执行的命令。像这样:

run:
     @java myprogram

正如 Oli 所建议的,这是 Make 的一项功能,而不是 Bash 的一项功能。

另一方面,Bash 永远不会回显正在执行的命令,除非您明确告诉它这样做(即使用 -x 选项)。

【讨论】:

+1。但为了澄清 OP 的困惑,或许值得澄清的是,这是 Make 的一个特性,而不是 Bash 的特性。 @OliCharlesworth:有道理,补充说。谢谢。 有没有办法禁用所有回声?或者在某个部分关闭它,然后再打开? @Benubird make -s 这样做了,恕我直言,无论如何这里是一个更好的解决方案。它最近作为此问题的单独答案发布。 这不适用于 if ... then 语句 :( 有什么想法吗?【参考方案2】:

更简单,使用make -s(静音模式)!

【讨论】:

赞成:这应该是这里真正接受的答案。使用@ 命令在您的 Makefile 中添加代码会使调试变得困难并增加很多混乱。 我同意这是要走的路 - 但请注意,在最初的问题描述中,我不会是调用 make 的人 - 我的导师会。因此,我无法控制传入的标志。我需要控制 makefile 中的输出。支持现实世界中最实用的解决方案。 你可以自己控制这个,使用.SILENT:目标。见make.mad-scientist.net/managing-recipe-echoing 实际上,如果您在-Wall 上发出警告,它仍然会打印它们。当然,如果您也想查看警告,为什么还要使用-s【参考方案3】:

你也可以使用.SILENT

.SILENT: run
hi:
     echo "Hola!"
run:
     java myprogram

在这种情况下,make hi 会输出命令,但make run 不会输出。

【讨论】:

【参考方案4】:

在命令前加上@ 的效果可以通过在行上使用尾随反斜杠扩展命令来扩展至一个部分。如果需要 .PHONY 命令来抑制输出,则可以使用以下内容开始该部分:

@printf "..."

【讨论】:

以上是关于抑制makefile中命令调用的回声?的主要内容,如果未能解决你的问题,请参考以下文章

如何抑制局部回声

makefie文件的基本说明和使用

makefie文件的基本说明和使用

基于深度神经网络的回声消除和噪声抑制的任务分割

Makefile文件的基本单元 —— 规则

嵌入式Linux—浅析Makefile