禁止在“使干净”(Makefile静默删除)中显示消息

禁止在“使干净”(Makefile静默删除)中显示消息,makefile,Makefile,我想知道如何避免Makefile中出现一些回音: clean: rm -fr *.o .SILENT:clean 此规则将打印: $>make clean rm -fr *.o $> 如何避免这种情况?如果在命令前面放一个@,它就不会在shell上回音。尝试将rm更改为@rm。()首先:实际命令必须在下一行(或者至少GNU Make是这样,它可能与其他Make不同-我不确定) (注意,您需要在每个规则中的rm-rf*.o之前添加一个选项卡) 可以通过在@前面加前

我想知道如何避免Makefile中出现一些回音:

clean:
    rm -fr *.o
.SILENT:clean
此规则将打印:

$>make clean   
rm -fr *.o

$>

如何避免这种情况?

如果在命令前面放一个@,它就不会在shell上回音。尝试将rm更改为@rm。(

首先:实际命令必须在下一行(或者至少GNU Make是这样,它可能与其他Make不同-我不确定)

(注意,您需要在每个规则中的
rm-rf*.o
之前添加一个选项卡)

可以通过在
@
前面加前缀使其静音:

因此,您的makefile变为

clean:
    @rm -rf *.o
如果没有要删除的
*.o
文件,您可能仍然会收到一条错误消息。要抑制这些,请添加以下内容

clean:
    -@rm -rf *.o 2>/dev/null || true
  • 2>/dev/null
    将任何错误消息传送到/dev/null,这样您就不会看到任何错误
  • 命令前面的
    -
    确保
    make
    忽略非零返回代码

事实上,我正在寻找其他东西,将这一行添加到Makefile中:

clean:
    rm -fr *.o
.SILENT:clean
同时默默地执行“清理”目标的每一步

直到有人指出这个缺点,我才把它作为我最喜欢的解决方案

从手册中:

更糟糕的是,这会使打印出的信息过多。警告/错误/私人消息隐藏在输出中。另一方面,
-s
.SILENT
)抑制任何内容。尤其是“无事可做”和“最新”的信息可能是一种痛苦。没有抑制它们的选项。你必须积极地过滤掉它们,或者使用类似的方法。以下是grep的解决方案:

但输出将有行号。因此,Perl解决方案更好,因为它会抑制行号并立即刷新stdout:

make | perl -ne '$|=1; print unless /nothing to be done|up to date/i'

这是一个有缺陷的工具。这比我能解释得更好。

我对这个古老的话题做出回应,因为它在搜索中出现得很高,答案令人困惑。为了满足用户的需求,只需:

clean:
    @rm -f *.o
@表示make不会回显该命令。
rm
-f
参数告诉
rm
忽略任何错误,例如没有
*.o
文件,并始终返回成功

我从OPs示例中删除了-r,因为它意味着递归,而这里我们只是
rm
ing
.o
文件,没有什么可递归的

不需要使用
2>&1>/dev/null
,因为使用
-f
不会打印错误

.SILENT: clean

可以代替
@
,但它在Makefile中的位置与它影响的命令不同,因此以后维护项目的人可能会感到困惑。这就是为什么@更受欢迎的原因。这是更好的参考位置。

这是处理wish bash的经典方法,但我一直在寻找GNU Make来解决这个问题。当然,我在下一行有命令,只是匆匆写下了问题。顺便说一句,你怎么看。沉默的回答(我的一个朋友发现的)?我还没有真正使用。沉默,GNU制作手册声明它只支持历史原因,但我喜欢它。它比您的命令中的许多
@
要简单得多。想想看,
-
|true
加在一起太多了-它们中的任何一个都应该足够了。如果没有要删除的内容,您需要其中一个来防止Gnu Make退出。最好使用
rm-f*.o
,因为如果没有要删除的内容,则不会返回错误。缺点是您从未从make获得任何反馈,并且没有与“silent”相反的命令行来关闭它。这就像用大锤打开一个罐子。只是为了强调我的支持——这真的应该是公认的答案。