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以獲得更多想法。

相關內容