두 개의 "tail -f" 명령을 나란히 출력

두 개의 "tail -f" 명령을 나란히 출력

파일에 기록하기 위해 주기적으로 단일 문자열을 내보내는 두 개의 스크립트가 있으며 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

관련 정보