在 Makefile 规则内通过管道传输 stdout 和 stderr

问题描述 投票:0回答:4

我想将脚本的输出通过管道传输到不同的程序。我通常会使用这两种形式做的事情:

 python test.py 2>&1 | pyrg
 python test.py |& pyrg

我的问题是它无法在 makefile 中工作:

[Makefile]
test:
    python test.py 2>&1 | pyrg [doesn't work]

我希望避免编写完成这项工作的脚本文件。

编辑:

这似乎是一个

pyrg
问题:

python test.py 2>&1 | tee test.out // Writes to the file both stderr and stdout
cat test.out | pyrg                // Works fine!
python test.py 2>&1 | pyrg         // pyrg behaves as if it got no input

这对我来说是一个糟糕的解决方案,因为如果测试失败,我永远不会到达

cat
部分(所有内容都在Makefile规则内)

linux bash shell makefile pipe
4个回答
11
投票

我偶然发现了这个问题,也遇到了同样的问题,并对答案不满意。我有一个二进制文件

TLBN
在测试用例
example2.TLBN
上失败了。

这是我的 make 文件首先看到的。

make:
     ./TLBN example2.TLBN > ex2_output.txt

失败并出现我期望的错误消息并停止 make 过程。

这是我的修复:

make:
    -./TLBN example2.TLBN > ex2_output.txt 2>&1

注意行开头的

-
,它告诉 make 忽略任何到 stderr 的输出。

希望这可以帮助有类似问题的人。


5
投票

它并没有解释为什么直接的方法不起作用,但它确实有效:

[Makefile]
test: 
    python test.py >test.out 2>&1; pyrg <test.out

3
投票

奇怪的是,我也遇到了同样的问题,并这样解决了:

check-errors:
    check-for-errors.sh &> errors.txt

我不太确定为什么

2>&1 >errors.txt
在这里不起作用,但
&>
却在这里工作


0
投票

运算符

|&
并非在所有 shell 中都有效,但它在 Bash 中有效。因此,您需要告诉 Make 使用 Bash shell 才能正常工作,如下所示:

SHELL=bash

test:
    python test.py |& pyreg
© www.soinside.com 2019 - 2024. All rights reserved.