gpt4 book ai didi

linux - 使用 tee 和 sed 重定向

转载 作者:太空宇宙 更新时间:2023-11-04 05:38:16 25 4
gpt4 key购买 nike

我在这里做错了什么?我没有从 tee 获得任何 STDOUT,但 test.log 已正确填充。

perl test.pl | tee -i | sed 's/\x1b\[[0-9;]*m//g' > test.log

我的目标是将 test.pl 打印的所有内容发送到 STDOUT 并将过滤后的版本(使用 sed)转储到 test.log

最佳答案

澄清后:

Daniel Schelper 的解决方案是正常人类可用 shell 上的正确解决方案(谷歌为什么从不使用 csh)。不幸的是,有时我们别无选择,所以有一个解决方案:

perl test.pl | tee /dev/stderr | sed 's/\x1b\[[0-9;]*m//g' > test.log

它的作用是将stdout复制到stderr,并且仅通过管道转发stdoutperl 的输出将显示在屏幕上(通过 stderr)。这有一个明显的警告:任何真正的错误都可能被隐藏。更安全的解决方案可能是:

perl test.pl > /tmp/temp.log; cat /tmp/tmp.log & sed 's/\x1b\[[0-9;]*m//g' /tmp/tmp.log

这当然会产生一个额外的文件。与 Bourne shell 相比,csh 上的好选项通常涉及更多的中间文件。

<小时/>

旧答案

tee 应该始终是最后一个管道程序(除非你想在中途记录一些东西),并且有一个文件名作为参数。前者是因为重点是在屏幕上查看输出(而不是传递它),第二个是因为 tee 在不将输出发送到文件时通常没有用处。

就目前而言,您正在通过 teestdout 传递到下一个管道 sed,这就是使用 > 运算符将所有内容转储到 test.log 中。事实上,您不应该同时拥有 >tee:

perl test.pl | sed 's/\x1b\[[0-9;]*m//g' | tee test.log

在屏幕和日志中获取 sed 的结果。如果我误解了,而您实际上确实想使用 tee 中途记录结果

perl test.pl | tee mid.log | sed 's/\x1b\[[0-9;]*m//g' > test.log

关于linux - 使用 tee 和 sed 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51332640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com