linux - Unix 从管道中的流中剥离 EOF(不是 EOL/空白)

标签 linux bash unix

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

相关文章:

c++ - 一个 C++ 应用程序无法在 Linux 上的一个线程中打开 2 个 SQLite 数据库?

macos - 在 Mac OS-X 中将 tail -f 与多个 Grep 命令一起使用时无输出

Linux 使用 RANDOM 函数

bash - 在 Unix 中使用 shell 脚本删除超过 10 天的文件

bash - bash 中意外标记 `(' 附近的语法错误

python - 根据给定的汉明距离折叠字符串集

ruby - 如何正确使用 tor-privoxy Ruby gem?

linux - gmtset BASEMAP_FRAME_RGB 透明度

linux - 拼写检查器 shell 脚本

bash - 头输出到特定行