![sed/head 和命名管道/FIFO 的奇怪行为(需要两次写入)](https://linux22.com/image/230297/sed%2Fhead%20%E5%92%8C%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93%2FFIFO%20%E7%9A%84%E5%A5%87%E6%80%AA%E8%A1%8C%E4%B8%BA%EF%BC%88%E9%9C%80%E8%A6%81%E4%B8%A4%E6%AC%A1%E5%86%99%E5%85%A5%EF%BC%89.png)
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 只是更简单,无论如何都会等待,而不必费心检查是否$
已使用。