これはあなたのために働きますか?
tail -n +0 -F /tmp/foo | sed '/EOF/q'
'EOF'があなたが探しているパターンだと思います。sed
コマンドは、見つかったときに終了します。つまり、次に書き込むときに終了する必要tail
があります。
tail
ファイルの終わり頃にパターンが見つかった場合、ファイルに表示されることのない出力がさらに表示されるのを待つという外部の可能性があると思います。それが本当に懸念される場合は、おそらくそれを殺すように手配することができます-パイプライン全体は終了時にsed
終了します(それが正しい動作ではないと判断する面白いシェルを使用している場合を除く)。
Bashについて不平を言う
恐れられているように、bash
(少なくともMacOS Xでは、おそらくどこでも)tail
終了するのを待ってぶらぶらする必要があると考えるシェルですsed
。時々-私が好きなよりも頻繁に-私は古き良きBourneシェルの振る舞いを好みますが、それはそれほど賢くなく、したがってBashよりも間違っていると推測されることが少なくなりました。 dribbler
は、メッセージを1秒に1回ドリブルするプログラム(例では「1:Hello」など)で、出力は標準出力になります。Bashでは、このコマンドシーケンスecho pqr >>/tmp/foo
は、別のウィンドウで''を実行するまでハングします。
date
{ timeout -t 2m dribbler -t -m Hello; echo EOF; } >/tmp/foo &
echo Hi
sleep 1 # Ensure /tmp/foo is created
tail -n +0 -F /tmp/foo | sed '/EOF/q'
date
残念ながら、この動作を制御するオプションがすぐにはわかりません。私は見つけshopt lithist
ましたが、それはこの問題とは無関係です。
KornShellのHooray
Kornシェルを使用してそのスクリプトを実行すると、期待どおりに機能することに注意してくださいtail
。何とかして殺されるために潜んでいます。echo pqr >> /tmp/foo
2番目のdateコマンドが完了した後、そこで機能するのは' 'です。