locate(1) 缓冲其输出

locate(1) 缓冲其输出

我正在使用locate(1)GNU findutils 来完成一个小任务,它似乎缓冲了它的输出。我将locate 的输出通过管道传输到另一个任务,该任务将在locate 找到这些行时对其进行处理。由于locate可能需要很长时间才能运行,我认为locate会打印出找到的文件,但看起来locate正在缓冲输出。

如果我在 TTY 上运行locate,它会立即打印出第一个匹配项,并可能用 10 秒的时间来查找其余的匹配项。

相反,如果我运行locate but pipeline to cat,则在整个命令完成之前我什么也看不到。

看来locate缓冲了输出,并且无法将其关闭。

我想要实现的是找到一些文件,并在通过管道输出找到它后立即运行命令。

locate something | xargs -n 1 do_something

但发生的情况是 xargs 和 do_something 在 find 完成之前不会被调用。

答案1

当然,我在发帖后立即找到了答案,在发帖时 stackexchange 建议的帖子

unbuffer(来自预期)解决了这个问题。

unbuffer locate something | xargs -n 1 do_something

运行命令的速度与locate 找到它们的速度一样快。

答案2

locate缓冲 STDOUT 流,您需要使 STDOUT 为locate无缓冲(或行缓冲)。

如果您使用的是GNU系统,则可以使用stdbuf(GNU自带coreutils)。

要使 STDOUT 为locate无缓冲:

stdbuf -o0 locate something | ...

行缓冲:

stdbuf -oL locate something | ...

检查man stdbuf以获得更多想法。

相关内容