我正在使用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
以獲得更多想法。