我有一个程序,它接受输入和标准输入,直到给出eof(在Linux上为CTRL-D)。我想用很多默认输入运行这个程序,然后继续输入内容,直到我手动命中CTRL-D来停止它。有没有办法删除bash管道输入的EOF?
IE:cat somedata.dat | <insert answer here> | ./myprogram
,myprogram
永远不会在stdin上收到EOF。
答案 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
。)