O que importa aqui é que os dois comandos tail escrevem para um descritor de arquivo para a mesma extremidade de escrita do mesmo pipe.
Se você fizer isso:
printf foo1 >> file1; sleep 1
printf foo2 >> file2; sleep 1
printf 'bar1\n' >> file1; sleep 1
printf 'bar2\n' >> file2
Você verá:
foo1foo2bar1
bar2
Porque é assim que eles foram escritos. Você deve certificar-se de que seus comandos geram uma linha completa por vez, e que essas linhas sejam menores que PIPE_BUF (4096 bytes no Linux) para que o write () seja atômico ( ele também pode escrever mais de uma linha por vez, desde que estejam todos cheios e seu tamanho cumulativo seja menor que PIPE_BUF).
Com o GNU grep
, você pode fazer isso canalizando seus comandos para grep --line-buffered '^'
(tail -f ./file1 | grep --line-buffered '^' &
tail -f ./file2 | grep --line-buffered '^') | cat
Isso garantiria que você recebesse uma chamada de sistema write()
para cada linha da saída de ambos os comandos (nos casos em que os comandos não terminassem sua última linha de saída, grep
adicionaria a nova linha ausente)