【发布时间】:2010-08-05 17:24:35
【问题描述】:
我正在编写一个名为“make all”的简短 shell 脚本。这并不重要,但如果是这样的话,有没有办法可以抑制“所有人都无所作为”的消息?我希望为 make 找到一个可以抑制这种情况的标志(不确定是否有),但是另外一行或两行代码也可以。
仅供参考,我正在使用 bash。
编辑:更清楚地说,我只想抑制没有什么可做的消息。否则,我想显示输出。
【问题讨论】:
我正在编写一个名为“make all”的简短 shell 脚本。这并不重要,但如果是这样的话,有没有办法可以抑制“所有人都无所作为”的消息?我希望为 make 找到一个可以抑制这种情况的标志(不确定是否有),但是另外一行或两行代码也可以。
仅供参考,我正在使用 bash。
编辑:更清楚地说,我只想抑制没有什么可做的消息。否则,我想显示输出。
【问题讨论】:
您可以将“所有”设置为 PHONY 目标(如果还没有的话),它以真正的目标为先决条件,并且做一些不起眼的事情:
.PHONY: all
all: realTarget
@echo > /dev/null
【讨论】:
: 是一个shell no-op...或者我曾经有过这样的用途。
all 现在有事可做,但它什么也没有。 echo 的另一个选项是将操作设为 @true,它应该不打印任何内容并静默成功。
我想改进以前的解决方案,只是让它更高效一点...:)
.PHONY: all
all: realTarget
@:
@true 也可以,但比@: 慢一点(我已经做了一些性能测试)。无论如何,两者都比“echo > /dev/null”快得多...
【讨论】:
标志-s沉默使:make -s all
编辑:我最初回答说标志-q 沉默了。它对我有用,尽管手册页将 -s, --silent, --quiet 指定为有效标志。
【讨论】:
-s、--silent 或--quiet
make all | grep -v "Nothing to be done for",但似乎他们删除了那个答案。
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 返回到标准输出。
【讨论】: