Considere o seguinte comando:
bash -c "echo x; cat 1" | tee 1
.
Meu entendimento é que ele seria bifurcado para um novo shell, x
gravaria em stdout, file 1 not found
gravaria em stderr, sairia e retornaria o controle ao processo pai e x
gravaria em stdout e em 1
. Portanto, eu esperaria que a saída final fosse x
e o arquivo 1
contém exatamente a string x
.
No entanto, este não é o caso. Na realidade, o arquivo 1
geralmente contém pelo menos duas instâncias x
e, às vezes, milhares de linhas de x
s. Em um teste em lote de executar o comando dez mil vezes, o número médio de x
s gravados no arquivo foi 52,3 e a mediana foi 1. Que mecânico está causando isso? Que distribuição de probabilidade modela esse comportamento? Suspeito que seja condicionalmente geométrico e uniforme.
tee
abriu o arquivo para gravação antes de abri-cat
lo para leitura, você pode obter muitosx
-es no arquivo. Nesse caso, o "loop" terminaria sempre que acat
leitura fosse mais rápida que atee
gravação, atingindo o final do arquivo.x
s gravados no arquivo foi de 4,35. Eu acho que vai depender muito da carga da máquina.Respostas:
Como é muito curioso, tentei investigá-lo com a ajuda do strace. Execute seu comando em um loop 1000 vezes:
Encontrei o arquivo com mais linhas (
wc -l */1 | sort -nr | head -n2
) e verifiquei o correspondentetrace.log
. Certamente posso ver muitos:Onde 7567 é
tee 1
e 7568 écat 1
. Os dois definitivamente estão alternando, então sim, como se suspeita, isso é tudo sobre o momento da execução (e eu imagino a alternância de contexto) dos dois comandos.fonte