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

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

我的问题是我的makefile:

...
run:
     java myprogram

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

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

【问题讨论】:

    标签: linux unix makefile posix


    【解决方案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 "..."
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        • 2015-10-07
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        相关资源
        最近更新 更多