我正在写一个调用'make all'的shell脚本。这不是关键,但是如果是这样的话,有没有办法可以抑制'nothing to be done for all'的消息呢?我希望能找到一个make的标志来抑制这种情况(不确定有没有),但是额外的一两行代码也可以。 仅供参考,我正在使用bash。 编辑:为了更清楚,我只想suppess消息there是没有什么要做的。否则,我想显示输出。
make() {
echo "this is stdout"
echo "this is stderr" >&2
printf 'oops, No rule to make target `%s`, not at all' "$1" >&2
}
测试我的解决方案:
$ { make foobar 2>&1 1>&3 | grep -v 'No rule to make target `all' >&2; } 3>&1
this is stdout
this is stderr
oops, No rule to make target `foobar`, not at all
$ { make all 2>&1 1>&3 | grep -v 'No rule to make target `all' >&2; } 3>&1
this is stdout
this is stderr
目前看来还不错。 不戴牙套怎么样?
$ make all 2>&1 1>&3 | grep -v 'No rule to make target `all' >&2 3>&1
bash: 3: Bad file descriptor
在本例中,我们需要显式创建fd 3
$ exec 3>&1; make all 2>&1 1>&3 | grep -v 'No rule to make target `all' >&2 3>&1
this is stdout
this is stderr
4条答案
按热度按时间jobtbby31#
您可以将“all”设置为PHONY目标(如果尚未设置),它以真实的目标为前提,并执行一些不显眼的操作:
dzhpxtsq2#
我想在以前的解决方案的基础上进行改进,只是为了让它更有效率一点...:)
@true也可以,但比@:(我做了一些性能测试)。无论如何,这两个都比“echo〉/dev/null”快得多...
6yt4nkrj3#
标志
-s
静音使:make -s all
**EDIT:**我最初回答的是标志
-q
使make沉默。它对我有效,尽管联机帮助页指定-s, --silent, --quiet
为有效标志。esyap4oy4#
grep解决方案:
构造
2>&1 1>&3
将make的stdout发送到fd 3,将make的stderr发送到stdout。grep然后读取前一个命令的stdout,删除有问题的行,并将其stdout发送到stderr。最后,fd 3返回到stdout。2022-11-17,对@Pryftan评论的回应:
忽略了我用错文本的小错误。
让我们创建一个输出一些内容的函数
测试我的解决方案:
目前看来还不错。
不戴牙套怎么样?
在本例中,我们需要显式创建fd 3
大括号是怎么回事?我认为它延迟了对内容的求值,这样就可以先处理 * 尾随 * 的 *
3>&1
,这样就可以使内部的1>&3
有效。