禁止在“使干净”(Makefile静默删除)中显示消息
我想知道如何避免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之前添加一个选项卡) 可以通过在@前面加前
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
将任何错误消息传送到/dev/null,这样您就不会看到任何错误2>/dev/null
- 命令前面的
确保-
忽略非零返回代码make
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”相反的命令行来关闭它。这就像用大锤打开一个罐子。只是为了强调我的支持——这真的应该是公认的答案。