【问题标题】:Unix strip EOF (not EOL/whitespace) from stream in pipeUnix 从管道中的流中剥离 EOF(不是 EOL/空白)
【发布时间】:2017-08-23 17:23:11
【问题描述】:

我有一个程序在给出 eof 之前接受输入和标准输入(Linux 上的 CTRL-D)。我想用很多默认输入来运行这个程序,然后继续输入,直到我手动按下 CTRL-D 来停止它。有什么方法可以删除 bash 管道放入的 EOF?

IE:cat somedata.dat | <insert answer here> | ./myprogram 这样myprogram 永远不会在标准输入上收到 EOF。

【问题讨论】:

    标签: linux bash unix


    【解决方案1】:

    Bash 实际上并没有添加“文件结尾”字符;没有这样的事情。相反,问题在于./myprogram 到达其标准输入的末尾(连接到管道),因此下次尝试读取字符时,它会改为文件结尾。没有办法让它突然切换到从终端“窃取”标准输入,因为它根本没有连接到那个输入。

    相反,要向./myprogram 提供比somedata.dat 中更多的输入,您可以要求cat 在读完somedata.dat 后开始读取(并转发)它自己的标准输入:

    cat somedata.dat - | ./myprogram
    

    cat somedata.dat /dev/stdin | ./myprogram
    

    编辑添加(根据 cmets 中的进一步问题):如果您有更复杂的管道输入 ./myprogram,而不仅仅是一个文件,那么您可以运行您的主命令并 然后 cat,将整个事情传递给./myprogram

    {
      reallyConfusingTransform < somedata.dat
      cat
    } | ./myprogram
    

    或一行:

    { reallyConfusingTransform < somedata.dat ; cat ; } | ./myprogram
    

    (请注意,我还删除了“cat 的无用使用”(UUOC),但如果您真的更喜欢这样使用cat,您仍然可以写cat somedata.dat | reallyConfusingTransform 而不是reallyConfusingTransform &lt; somedata.dat。 )

    【讨论】:

    • 太好了,这正是我想要的。我想这也很有意义,一个程序不能只是“不产生 EOF”。它可以做的最好的事情是手动开始将标准输入管道传输到标准输出。是否有可以使用的插播版本? EG:cat somedata.dat | reallyConfusingTransform | something | ./myprogram 可能是对 tee 或类似实用程序的某种论证?
    • @LambdaBeta:不是那种形式,但是是的。我在回答中添加了一些内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多