私はlocate(1)
小さな操作のためにGNU findutilsを使用していますが、出力をバッファリングしているようです。検索の出力を、検索が検索した行を処理する別の操作にパイプします。検索を実行するのに時間がかかる可能性があるため、検索は見つかったファイルを印刷すると思いましたが、検索は出力をバッファリングしているようです。
TTYで検索を実行すると、最初の一致がすぐに印刷され、残りの項目を見つけるのに10秒かかります。
逆に、検索を実行してパイプラインをcatとして実行すると、コマンド全体が完了するまで何も表示されません。
検索は出力をバッファリングしてオフにできないようです。
私が達成したいのは、いくつかのファイルを見つけてパイプ出力を介して見つかったらすぐにコマンドを実行することです。
locate something | xargs -n 1 do_something
ただし、xargsとdo_somethingはfindが完了するまで呼び出されません。
答え1
もちろん、投稿直後に答えを見つけました。投稿時にstackexchangeが推奨する投稿。
unbuffer
(予想通り)問題が解決しました。
unbuffer locate something | xargs -n 1 do_something
コマンドの実行は、検索がコマンドを検索するのと同じくらい高速です。
答え2
locate
locate
STDOUTストリームをバッファリングするには、STDOUTをバッファリングされていない(またはラインバッファリングされた)作成する必要があります。
GNUシステムを使用している場合はそれを使用できますstdbuf
(GNUが付属していますcoreutils
)。
STDOUTをバッファリングしないようにするには、次の手順を実行しますlocate
。
stdbuf -o0 locate something | ...
ラインバッファリング:
stdbuf -oL locate something | ...
より多くのアイデアをチェックしてくださいman stdbuf
。