3

次のようなwhileループでプロセス置換のstdoutを使用しようとしています:

#!/bin/bash

FILE_1=f1.txt
FILE_2=f2.txt

while read LINE; do
    echo "$LINE"
done < <(paste <(tail -f "$FILE_1") <(tail -f "$FILE_2"))

新しいデータがファイルに追加されるたびに、FILE_1 と FILE_2 の最後の行をマージすることになっています。もちろん、while ループで行を出力するだけではありませんが、これは良い例です。

残念ながら、このスクリプトを実行すると、ターミナルに留まって何もしません。

この行だけを実行します:

paste <(tail -f "$FILE_1") <(tail -f "$FILE_2")

完全に機能し、ファイルにデータを追加すると、端末に出力が表示されます。

stdout を別のプロセスにパイプするために使用する必要がある特別な構文はありますか?

やってみました

paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") | while read LINE; do...

しかし、それはまだ端末に座っているだけです。

4

2 に答える 2

5

stdout が端末でない場合、pasteその出力をバッファリングします。あなたのコマンドは機能します。何かが起こる前に、一定量の入力が必要です。

出力をすぐに取得するには、次のコマンドで stdout のバッファを解除できますstdbuf

stdbuf -oL paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") | while read LINE; do...
于 2015-04-07T05:33:48.553 に答える
0

2 つの主な問題があると思います。1 つ目は、必要なリダイレクトを実現するために、ヒア文字列コマンド置換、およびプロセス置換の使用を組み合わせる必要があることです。例えば:

while read LINE
do 
    echo "$LINE"
done <<< "$( paste <( tail -2 "$FILE_1" ) <( tail -2 "$FILE_1" ) )"

上記のコマンドは正常に機能します。ただし、上記のコマンドは、 (例: )の閉じた形式を使用して決定可能な一連の行を使用することに注意してください。この状況ではオプションを使用できないと思います。探していますが、まだルールが見つかりません。貼り付けオプションを使用しても違いはありません。FILE_1FILE_2tailtail -2follow--serial

于 2015-04-07T05:05:20.400 に答える