我有一个程序,它接受输入和标准输入,直到给出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/