【问题标题】:transform stream sent to a file by tee由 tee 发送到文件的转换流
【发布时间】:2022-01-20 16:16:11
【问题描述】:

我想将流的 stdout 和 stderr 重定向到屏幕和文件。为此,我使用了工具tee。但是,在该流进入文件之前,我想使用管道对其进行转换。到目前为止,我只设法转换到标准输出的流。

例子:

echo 'hello' | tee output.txt | tr 'h' 'e'

=> 这会将eello 输出到标准输出并将hello 保存到 output.txt

但是我想要将hello 打印到标准输出并将eello 保存到 output.txt。

注意:更改输入流不是我的问题的选项。

【问题讨论】:

    标签: linux bash redirect pipe tee


    【解决方案1】:

    bash:

    echo 'hello' | tee >(tr 'h' 'e' > output.txt)
    

    使用bash 和 Linux:

    echo 'hello' | tee /proc/$$/fd/255 | tr 'h' 'e' > output.txt
    

    见:What is the use of file descriptor 255 in bash process

    【讨论】:

    • 我犯的错误是在>( 之间添加了一个额外的空格,这在bash 中显然是非法的。
    【解决方案2】:

    您可以在单个 awk 中执行此操作而无需多个管道:

    echo 'hello' | awk '1; {gsub(/h/, "e"); print > "output.txt"}'
    

    【讨论】:

    • 有了这个完整的想法sedecho 'hello' | sed -n 'p; s/h/e/g; w output.txt'
    • 是的,这是一个很好的@Cyrus