sed/head 和命名管道/FIFO 的奇怪行为(需要两次写入)

sed/head 和命名管道/FIFO 的奇怪行为(需要两次写入)

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 只是更简单,无论如何都会等待,而不必费心检查是否$已使用。

相关内容