Unix管道中的流EOF(不是EOL /空白)

时间:2017-03-30 01:11:50

标签: linux bash unix

我有一个程序,它接受输入和标准输入,直到给出eof(在Linux上为CTRL-D)。我想用很多默认输入运行这个程序,然后继续输入内容,直到我手动命中CTRL-D来停止它。有没有办法删除bash管道输入的EOF?

IE:cat somedata.dat | <insert answer here> | ./myprogrammyprogram永远不会在stdin上收到EOF。

1 个答案:

答案 0 :(得分:3)

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

相反,为了向./myprogram提供更多输入,而不仅仅是somedata.dat中的内容,您可以在cat完成阅读后somedata.dat开始阅读(并转发)自己的标准输入{{} 1}}:

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。)