【问题标题】:Suppress "nothing to be done for 'all' "禁止“对‘所有人’无事可做”
【发布时间】:2010-08-05 17:24:35
【问题描述】:

我正在编写一个名为“make all”的简短 shell 脚本。这并不重要,但如果是这样的话,有没有办法可以抑制“所有人都无所作为”的消息?我希望为 make 找到一个可以抑制这种情况的标志(不确定是否有),但是另外一行或两行代码也可以。

仅供参考,我正在使用 bash。

编辑:更清楚地说,我只想抑制没有什么可做的消息。否则,我想显示输出。

【问题讨论】:

    标签: shell makefile


    【解决方案1】:

    您可以将“所有”设置为 PHONY 目标(如果还没有的话),它以真正的目标为先决条件,并且做一些不起眼的事情:

    .PHONY: all
    
    all: realTarget
        @echo > /dev/null
    

    【讨论】:

    • 而不是回显,你可以只做 @: 用于无操作
    • @William Pursell:天哪,你是对的。我从来不知道: 是一个shell no-op...或者我曾经有过这样的用途。
    • 我喜欢这种偷偷摸摸的方法。警告消失了,因为all 现在有事可做,但它什么也没有。 echo 的另一个选项是将操作设为 @true,它应该不打印任何内容并静默成功。
    • 这会破坏“make -q”,因为 make 总是认为有工作要做
    • 这个解决方案至少在 MinGW 中增加了约 1 秒的延迟
    【解决方案2】:

    我想改进以前的解决方案,只是让它更高效一点...:)

    .PHONY: all
    all: realTarget
            @:
    

    @true 也可以,但比@: 慢一点(我已经做了一些性能测试)。无论如何,两者都比“echo > /dev/null”快得多...

    【讨论】:

      【解决方案3】:

      标志-s沉默使:make -s all

      编辑:我最初回答说标志-q 沉默了。它对我有用,尽管手册页将 -s, --silent, --quiet 指定为有效标志。

      【讨论】:

      • W Tenney,对我来说这是-s--silent--quiet
      • 我应该更清楚。我只想抑制文件是最新的情况。否则我想显示输出。
      • 我看到其他人回答并建议make all | grep -v "Nothing to be done for",但似乎他们删除了那个答案。
      【解决方案4】:

      grep 解决方案:

      { make all 2>&1 1>&3 | grep -v 'No rule to make target `all' >&2; } 3>&1 
      

      构造2>&1 1>&3 将make 的stdout 发送到fd 3 并将make 的stderr 发送到stdout。 grep 然后从前一个命令的标准输出中读取,删除有问题的行并将其标准输出发送到标准错误。最后将 fd 3 返回到标准输出。

      【讨论】:

      • 真的有必要吗?与只执行 grep -v 有何不同?
      • 首先,无论如何,在我的制作中,该消息会发送到 stderr,因此至少您必须重定向 stderr 才能使 grep 生效。接下来,您希望 make 的其余输出保持不变,因此我不想将 stderr 与 stdout 混合。最后,这对我来说也是一个学习练习。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2021-04-05
      • 2023-03-10
      • 2021-09-06
      相关资源
      最近更新 更多