ファイルに書き込むには、定期的に単一の文字列をエクスポートする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