【问题标题】:Is there a way to fanout a stream in posix shell or bash? [duplicate]有没有办法在 posix shell 或 bash 中扇出流? [复制]
【发布时间】:2017-10-09 09:00:33
【问题描述】:

我想要一些类似的东西:

cat a > b
prog1 < b
prog2 < b

无需创建临时 b 文件。

如果我只有一个程序,我可以使用管道:

cat a | prog1

我想知道 shell 是否具有支持类似以下内容的语法:

cat a (|prog1) (|prog2)

或者有没有方便的实用程序可以提供帮助?比如:

cat a | fanout prog1 prog2

【问题讨论】:

    标签: linux bash shell posix utility


    【解决方案1】:

    您可以使用tee + process substitution fork 数据流并将其发送到多个进程。

    cat a | tee >(prog1) | prog2
    

    tee 将文件名作为参数。 &gt;(prog1) 被替换为 /dev/fd/63 之类的文件名,tee 可以写入。

    要写入两个以上的程序,请添加更多进程替换:

    cat a | tee >(prog1) >(prog2) >(prog3) | prog4
    

    【讨论】:

    • tee &gt;(prog1) &gt;(prog2) &gt;(prog3) &lt; a | prog4 减少了额外的管道。
    • @codeforester:我认为可以安全地假设 cat a 只是一个 example 命令,所以在一般情况下您确实需要一个管道(或 输入 进程替换)。
    • 您需要使用cat a | tee &gt;(prog1) &gt;(prog2) &gt;/dev/null,否则prog1 的输出将发送到prog2 - 试试echo hi | tee &gt;(tr 'h' '@') | cat -n。但是,您会得到不可预测的异步输出行为,并且在执行下一个命令时后台进程可能尚未完成。请参阅我的this answer
    猜你喜欢
    • 2017-10-10
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2021-08-07
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多