我有一个程序接受输入和标准输入,直到给出 eof(在 Linux 上为 CTRL-D)。我想用很多默认输入运行这个程序,然后继续输入东西,直到我手动按下 CTRL-D 来停止它。有什么方法可以删除 bash 管道放入的 EOF?
即:cat somedata.dat | <insert answer here> | ./myprogram
这样 myprogram
永远不会在标准输入上收到 EOF。
最佳答案
Bash 实际上并没有添加“文件结束”字符;没有这样的事情。相反,问题是 ./myprogram
到达其标准输入(连接到管道)的末尾,因此下次它尝试读取一个字符时,它会得到文件末尾。没有办法让它突然切换到从终端“窃取”标准输入,因为它根本没有连接到那个输入。
相反,向 ./myprogram
提供更多输入不仅仅是 somedata.dat
中的内容, 你可以问cat
在完成阅读后开始阅读(并转发)自己的标准输入 somedata.dat
:
cat somedata.dat - | ./myprogram
或
cat somedata.dat /dev/stdin | ./myprogram
编辑添加(根据评论中的进一步问题):如果您有更复杂的管道送入 ./myprogram
,而不仅仅是一个文件,那么您可以运行主命令,然后然后 cat
, 将整个事情通过管道传输到 ./myprogram
:
{
reallyConfusingTransform < somedata.dat
cat
} | ./myprogram
或在一行中:
{ reallyConfusingTransform < somedata.dat ; cat ; } | ./myprogram
(请注意,我还删除了“对 cat
的无用使用”(UUOC),但如果您真的更喜欢那样使用 cat
,您仍然可以编写 cat somedata.dat | reallyConfusingTransform
而不是 reallyConfusingTransform < somedata.dat
。 )
关于linux - Unix 从管道中的流中剥离 EOF(不是 EOL/空白),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43106781/