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

noo*_*ler 121 unix linux posix makefile

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

我的问题是我的makefile:

...
run:
     java myprogram
Run Code Online (Sandbox Code Playgroud)

还会将运行我的程序的命令(例如java myprogram)输出到输出文件,这样我的文件就会包含这个额外的行,导致指纹错误.

有没有办法在没有命令调用回显到命令行的情况下执行命令?

小智 205

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

run:
     @java myprogram
Run Code Online (Sandbox Code Playgroud)

正如Oli所说,这是Make而不是Bash的一个特征.

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

  • +1.但是为了清除OP的混乱,或许值得澄清的是,这是Make的一个特征,而不是Bash的特征. (4认同)
  • @Benubird `make -s` 就是这样做的,恕我直言,这里是一个更好的解决方案。它最近作为这个问题的单独答案发布。 (3认同)

小智 61

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

  • 我同意这是要走的路 - 但请注意,在最初的问题描述中,我不会是那个调用make的人 - 我的导师会.因此,我无法控制传入的标志.我需要控制makefile中的输出.尽管为现实世界中最实用的解决方案提供了支持. (10认同)
  • 赞成:这真的应该是这里公认的答案。用 `@` 命令散布你的 Makefile 会使调试变得困难并增加很多混乱。 (6认同)
  • 您可以使用`.SILENT:`目标自己控制它.见http://make.mad-scientist.net/managing-recipe-echoing/ (5认同)

Kie*_*ham 20

你也可以使用 .SILENT

.SILENT: run
    hi:
         echo "Hola!"
    run:
         java myprogram
Run Code Online (Sandbox Code Playgroud)

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


小智 8

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

@printf "..."
Run Code Online (Sandbox Code Playgroud)