mkfifo
我在 shell 中创建了一个 fifo ,用 rw 模式打开exec 3<>fifo
。
当我sed 1q <&3
在另一个 shell 中运行并向 fifo 写入一行时,sed 不会打印该行,直到我向 fifo 写入另一行。为什么会出现这种情况? (这不会发生在head -n1
)
答案1
您可以在一个 shell 会话中复制它,例如
(echo foo; sleep 3; echo bar) | busybox sed 1q
您将看到仅在延迟后才出现单独的输出线。
可能发生的情况是,Busybox 的实现在处理第一行之前继续读取以确定$
(最后一行)地址说明符是否应匹配。在管道关闭之前,或者看到第二行出现之前,它无法确定$
应解析哪种方式。
并非所有 sed 都会发生这种情况,例如 GNU sed 和我的 Mac 上的 sed 立即打印第一行。他们可以做到这一点,因为脚本不使用$
,所以所需的所有信息都已经存在。如果您将脚本更改为使用的内容$
,例如
(echo foo; sleep 3; echo bar) | sed -n '$!p'
他们也必须等待第二条线。
据推测,Busybox 只是更简单,无论如何都会等待,而不必费心检查是否$
已使用。