抑制make clean中的消息(Makefile silent remove)

cla*_*laf 41 makefile

我想知道如何在Makefile中避免一些回声:

clean:
    rm -fr *.o
Run Code Online (Sandbox Code Playgroud)

此规则将打印:

$>make clean   
rm -fr *.o

$>
Run Code Online (Sandbox Code Playgroud)

我怎么能避免这种情况?

plo*_*lof 71

首先:实际的命令必须在下一行(或至少是与GNU的情况下做,这可能是与其他制作的不同 - 我不知道那)

clean:
    rm -rf *.o
Run Code Online (Sandbox Code Playgroud)

(注意,你需要一个TAB之前rm -rf *.o的每个规则)

保持沉默可以通过添加前缀@:

所以你的makefile变成了

clean:
    @rm -rf *.o
Run Code Online (Sandbox Code Playgroud)

如果没有*.o要删除的文件,您可能仍会收到错误消息.要禁止这些,请添加以下内容

clean:
    -@rm -rf *.o 2>/dev/null || true
Run Code Online (Sandbox Code Playgroud)
  • 2>/dev/null 将任何错误消息传递给/ dev/null - 这样您就不会看到任何错误
  • -在命令前可以确保make忽略了非归零码

  • 想想看,`-`和`|| 真的`在一起太多了 - 其中任何一个都应该足够了.如果没有要删除的内容,您需要其中一个来阻止Gnu Make退出.更好的方法是使用`rm -f*.o`,因为如果没有要删除的内容,则不会返回错误. (2认同)

cla*_*laf 24

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

.SILENT:clean
Run Code Online (Sandbox Code Playgroud)

同时静默执行"干净"目标的每一步.

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

  • 缺点是你永远不会从你的make获得任何反馈,并且没有与"silent"相反的命令行来关闭它.这就像用大锤打开一个罐子. (10认同)

pho*_*an1 14

我正在回应这个古老的话题,因为它在搜索中占据了很高的位置并且答案令人困惑.为了做到用户想要的,所需要的只是:

clean:
    @rm -f *.o
Run Code Online (Sandbox Code Playgroud)

@表示make不会回显该命令.告诉我们忽略任何错误的-f论据,比如没有文件,并且总是返回成功.rmrm*.o

我移除了有机磷农药例如-r,因为这意味着递归,在这里我们只是rm荷兰国际集团.o的文件,没有递归.

没有必要,2>&1 >/dev/null因为-f没有错误打印.

.SILENT: clean
Run Code Online (Sandbox Code Playgroud)

代替@它工作,但它与Makefile中的命令不在同一个地方,因此稍后维护项目的人可能会感到困惑.这就是为什么@是首选.这是更好的参考地点.


SCF*_*nch 8

如果在命令前放置一个@,它就不会回显到shell.尝试将rm更改为@rm.(参考)