shell 禁止“对”all“不执行任何操作“

xe55xuns  于 2022-11-25  发布在  Shell
关注(0)|答案(4)|浏览(138)

我正在写一个调用'make all'的shell脚本。这不是关键,但是如果是这样的话,有没有办法可以抑制'nothing to be done for all'的消息呢?我希望能找到一个make的标志来抑制这种情况(不确定有没有),但是额外的一两行代码也可以。
仅供参考,我正在使用bash。
编辑:为了更清楚,我只想suppess消息there是没有什么要做的。否则,我想显示输出。

jobtbby3

jobtbby31#

您可以将“all”设置为PHONY目标(如果尚未设置),它以真实的目标为前提,并执行一些不显眼的操作:

.PHONY: all

all: realTarget
    @echo > /dev/null
dzhpxtsq

dzhpxtsq2#

我想在以前的解决方案的基础上进行改进,只是为了让它更有效率一点...:)

.PHONY: all
all: realTarget
        @:

@true也可以,但比@:(我做了一些性能测试)。无论如何,这两个都比“echo〉/dev/null”快得多...

6yt4nkrj

6yt4nkrj3#

标志-s静音使:make -s all

**EDIT:**我最初回答的是标志-q使make沉默。它对我有效,尽管联机帮助页指定-s, --silent, --quiet为有效标志。

esyap4oy

esyap4oy4#

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然后读取前一个命令的stdout,删除有问题的行,并将其stdout发送到stderr。最后,fd 3返回到stdout。
2022-11-17,对@Pryftan评论的回应:
忽略了我用错文本的小错误。
让我们创建一个输出一些内容的函数

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

大括号是怎么回事?我认为它延迟了对内容的求值,这样就可以先处理 * 尾随 * 的 * 3>&1,这样就可以使内部的1>&3有效。

相关问题