Isso é muito curioso, então eu tentei investigar isso com a ajuda de strace. Ran seu comando em um loop 1000 vezes:
mkdir {000..999}
for i in {000..999}; do
echo $i
(cd $i; strace -f -o trace.log bash -c 'bash -c "echo x; cat 1" | tee 1 >/dev/null'; )
done
Encontrou o arquivo com mais linhas ( wc -l */1 | sort -nr | head -n2
) e verificou o trace.log
correspondente. Eu certamente posso ver muito:
7567 <... read resumed> "x\n", 8192) = 2
7567 write(1, "x\n", 2) = 2
7567 write(3, "x\n", 2) = 2
7567 read(0, <unfinished ...>
7568 read(3, "x\n", 131072) = 2
7568 write(1, "x\n", 2) = 2
7567 <... read resumed> "x\n", 8192) = 2
7567 write(1, "x\n", 2) = 2
7567 write(3, "x\n", 2) = 2
7567 read(0, <unfinished ...>
7568 read(3, "x\n", 131072) = 2
7568 write(1, "x\n", 2) = 2
7567 <... read resumed> "x\n", 8192) = 2
7567 write(1, "x\n", 2) = 2
7567 write(3, "x\n", 2) = 2
7567 read(0, <unfinished ...>
Onde 7567 é tee 1
e 7568 é cat 1
. Os dois estão definitivamente alternando, então sim, como suspeitamos, isso é tudo sobre o momento da execução (e eu imagino mudança de contexto) dos dois comandos.