我有一个程序,它接受输入和标准输入,直到给出eof(linux上的ctrl-d)。我想用很多默认输入运行这个程序,然后继续输入,直到我手动按ctrl-d停止它。有什么方法可以删除bash管道放入的eof吗?
即:cat somedata.dat | <insert answer here> | ./myprogram这样,myprogram就不会在stdin上收到eof。

最佳答案

bash实际上并没有添加“文件尾”字符;没有这样的东西。相反,问题是./myprogram到达其标准输入(连接到管道)的末尾,因此下次尝试读取字符时,它将改为获取文件结尾。无法让它突然切换到从终端“窃取”标准输入,因为它根本没有连接到该输入。
相反,要向./myprogram提供比somedata.dat中的内容更多的输入,可以要求cat在完成读取后开始读取(和转发)自己的标准输入:

cat somedata.dat - | ./myprogram


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

编辑以添加(根据注释中的进一步问题):如果您有一个更复杂的管道输入到somedata.dat,而不仅仅是一个文件,那么您可以运行您的主命令,然后./myprogram,将整件事情发送到cat
{
  reallyConfusingTransform < somedata.dat
  cat
} | ./myprogram

或一行:
{ reallyConfusingTransform < somedata.dat ; cat ; } | ./myprogram

(注意,我还消除了“无用的./myprogram”(uuoc)用法,但是如果您真的喜欢这样使用cat,您仍然可以编写cat,而不是cat somedata.dat | reallyConfusingTransform

关于linux - 管道中的流中的Unix strip EOF(不是EOL/空白),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43106781/

10-12 20:21