我想将脚本的输出通过管道传输到不同的程序。我通常会使用这两种形式做的事情:
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规则内)
我偶然发现了这个问题,也遇到了同样的问题,并对答案不满意。我有一个二进制文件
TLBN
在测试用例 example2.TLBN
上失败了。
这是我的 make 文件首先看到的。
make:
./TLBN example2.TLBN > ex2_output.txt
失败并出现我期望的错误消息并停止 make 过程。
这是我的修复:
make:
-./TLBN example2.TLBN > ex2_output.txt 2>&1
注意行开头的
-
,它告诉 make 忽略任何到 stderr 的输出。
希望这可以帮助有类似问题的人。
它并没有解释为什么直接的方法不起作用,但它确实有效:
[Makefile]
test:
python test.py >test.out 2>&1; pyrg <test.out
奇怪的是,我也遇到了同样的问题,并这样解决了:
check-errors:
check-for-errors.sh &> errors.txt
我不太确定为什么
2>&1 >errors.txt
在这里不起作用,但&>
却在这里工作
运算符
|&
并非在所有 shell 中都有效,但它在 Bash 中有效。因此,您需要告诉 Make 使用 Bash shell 才能正常工作,如下所示:
SHELL=bash
test:
python test.py |& pyreg