2つの「tail -f」コマンドを並べて出力

2つの「tail -f」コマンドを並べて出力

ファイルに書き込むには、定期的に単一の文字列をエクスポートする2つのスクリプトがあり、tail -f使用しているスクリプトを並べて組み合わせる必要があります。これはうまくいきますが、paste出力を別のスクリプトにパイプすることはできません。tail -f並べた文字列の連続出力です。

問題を説明/再現するには、次のスクリプトがあります。

p1.sh:

#!/bin/bash

i=0
while true
do
  i=$((i+1))
  sleep 4
  echo "P1string$i" >> out1.log
done

p2.sh:

#!/bin/bash

i=0
while true
do
  i=$((i+1))
  sleep 4
  echo "P2string$i" >> out2.log
done

私は次のようにバックグラウンドで実行します。

$ ./p1.sh &
$ ./p2.sh &

これで、次のように動作します。

paste <(tail -f out1.log) <(tail -f out2.log)

しかし、これはうまくいきません。

paste <(tail -f out1.log) <(tail -f out2.log) | tail -f

原則として、これは標準出力にパイプされ、tail -f動作します!いいえ?

答え1

「原則として、これはstdoutをtail -fにパイピングするので、うまくいくはずです!いいえ?」という質問に答えるには、実際には「いいえ」です。

このtailコマンドは、ファイルまたは標準入力の最後の10行の出力を提供するためのものです。パイプで使用されている場合は、パイプが閉じるのを待ってからバッファリングされた最後の10行を印刷します。あなたの例では、パイプは閉じていないので、tailは何も印刷しません。

これを証明する簡単なテストは、while true; do echo "Hello"; done | tail -f何も印刷しないことです。

答え2

並べておきたいですか...一度試してください。

paste file1.txt file2.txt > merged.txt

または分離したい場合

paste -d ',' file1.txt file2.txt > merged.txt

関連情報