我想知道如何在Makefile中避免一些回声:
clean:
rm -fr *.o
此规则将打印:
$>make clean
rm -fr *.o
$>
我该如何避免?
答案 0 :(得分:69)
首先:实际命令必须在下一行(或者至少是GNU Make的情况,它可能与其他Make不同 - 我不确定)
clean:
rm -rf *.o
(请注意,在每个规则中rm -rf *.o
之前需要 TAB )
使其保持沉默可以通过添加@
:
所以你的makefile变成了
clean:
@rm -rf *.o
如果没有要删除的*.o
个文件,您可能仍然会收到错误消息。要取消这些,请添加以下
clean:
-@rm -rf *.o 2>/dev/null || true
2>/dev/null
将任何错误消息传递给/ dev / null - 因此您不会看到任何错误-
确保make
忽略非零返回码答案 1 :(得分:24)
事实上我正在寻找其他东西,将这一行添加到Makefile:
.SILENT:clean
在静默执行“干净”目标的每一步时。
在有人指出这个问题之前,我会将此作为我最喜欢的解决方案!
答案 2 :(得分:14)
我正在回应这个古老的话题,因为它在搜索中占据了很高的位置,答案令人困惑。为了做到用户想要的,所需要的只是:
optional func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [String : AnyObject])
@表示make不会回显该命令。
clean:
@rm -f *.o
的{{1}}参数告诉-f
忽略任何错误,例如没有rm
个文件,并始终返回成功。
我从OPs示例中删除了-r,因为它意味着递归,这里我们只是rm
*.o
个rm
个文件,没有什么可以递归的。
不需要.o
,因为使用2>&1 >/dev/null
时不会打印错误。
-f
代替.SILENT: clean
,但它与Makefile中的命令不在同一个地方,因此稍后维护项目的人可能会感到困惑。这就是为什么@是首选。这是更好的参考地点。
答案 3 :(得分:8)
如果在命令前放置@,它不会回显到shell。尝试将rm更改为@rm。 (的 Reference 强>)
答案 4 :(得分:4)
来自手册:.SILENT
is essentially obsolete since @
is more flexible.
更糟糕的是 make 打印的信息太多了。警告/错误/私人消息隐藏在输出中。另一方面,-s
(.SILENT
)可以抑制任何事情。特别是“无所事事”和“最新”的消息可能是一种痛苦。没有选择来压制它们。您必须主动过滤它们或使用colormake之类的内容。这是 grep 的解决方案:
make | egrep -hiv 'nothing to be done|up to date'
但输出会有行号。因此,Perl解决方案更好,因为它可以立即抑制行号和刷新标准:
make | perl -ne '$|=1; print unless /nothing to be done|up to date/i'
制作一个有缺陷的工具。 "What’s Wrong With GNU make?"比我更好地解释了这一点。