Sri*_*bat 7 unix netcat pipe fifo
第一个管道工作正常(打印“c”):
echo "a" | sed 's/a/b/' | sed 's/b/c/'
Run Code Online (Sandbox Code Playgroud)
这个不符合我的预期(当我将“a”输入到我的 fifo 中时没有打印任何内容):
mkfifo fifo;
cat fifo | sed 's/a/b/' | sed 's/b/c/'
Run Code Online (Sandbox Code Playgroud)
但是,如果我从后一个管道中删除第二个“sed”命令,则会打印“b”。我认为我对管道和重定向的理解太简单了。有人可以向我解释如何解决第二种情况,以便我可以对 fifo 的内容运行两个连续的命令吗?
(请注意,这不是特定于 fifo 的问题,netcat 也会出现相同的行为。我发布了一个关于 netcat的类似问题,但没有得到答案)
使用sed的-u( --unbuffered) 选项,因此它会写入它的输出,而不是先收集它以便稍后进行快速、大量写入。
cat fifo | sed -u 's/a/b/' | sed -u 's/b/c/'
cat 总是无缓冲的。
如果不是关于sed,而是一些具有输出缓冲的程序,但没有禁用它的选项,那么有一些工具可以帮助强制缓冲关闭 - 查看man unbuffer和man stdbuf.
如果它是一个 shell 脚本,则默认情况下它应该是无缓冲的:当命令在脚本中创建输出并退出时,输出将被刷新。否则,您将在 shell 脚本中使用 unbuffer。
有关背景信息,请参阅此stdio 缓冲概述。
| 归档时间: |
|
| 查看次数: |
801 次 |
| 最近记录: |