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


147

我为分配编写了一个程序,该程序应该将其输出打印到stdout。分配规范要求创建一个Makefile,该文件在被调用make run > outputFile时应运行程序并将输出写入文件,该文件的SHA1指纹与规范中给出的指纹相同。

我的问题是我的makefile:

...
run:
     java myprogram

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

有什么方法可以执行命令而命令调用不回显命令行?

Answers:


247

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

run:
     @java myprogram

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

另一方面,除非您明确指示Bash执行命令,否则Bash将永远不会回显正在执行的命令-x


6
+1。但是只是为了消除OP的混乱,也许值得澄清这是Make的功能,而不是Bash的功能。
奥利弗·查尔斯沃思

1
@OliCharlesworth:有道理,补充说。谢谢。

有没有一种方法可以禁用所有回声?还是将其关闭一段,然后再重新打开?
Benubird

2
@Benubird make -s做到了,而且恕我直言,这是一个更好的解决方案。它最近被发布为该问题的单独答案。
Tripleee '16

1
对于if ... then语句,这不起作用:(有什么想法吗?
user1623521

74

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


3
Upvote:这实际上应该是这里公认的答案。使用@命令散布Makefile 使其难以调试,并增加了很多混乱。
Tripleee '16

11
我同意这是要走的路-但是请注意,在最初的问题描述中,我不会是那个叫make的人-我的教练会是。因此,我将无法控制传入的标志。我需要控制makefile中的输出。虽然支持现实世界中最实用的解决方案。
noobler '16

6
您可以使用.SILENT:目标自己控制。参见make.mad-scientist.net/managing-recipe-echoing
MadScientist 18-4-4

实际上,如果您有警告,-Wall它仍然会打印它们。当然,-s如果您也想看到警告,为什么还要使用?
User81862311

33

您也可以使用 .SILENT

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

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


1

@通过在行上使用尾部反斜杠来扩展命令,可以将命令前面带有的效果扩展到一个部分。如果.PHONY需要禁止输出的命令,则可以从以下部分开始:

@printf "..."
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.