![locate(1) 缓冲其输出](https://linux22.com/image/95435/locate(1)%20%E7%BC%93%E5%86%B2%E5%85%B6%E8%BE%93%E5%87%BA.png)
我正在使用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
以获得更多想法。