Considérez la commande suivante:
bash -c "echo x; cat 1" | tee 1
.
Ma compréhension est qu'il se bifurquerait vers un nouveau shell, écrirait x
sur stdout, écrirait file 1 not found
sur stderr, quitterait et retournerait le contrôle au processus parent, et écrirait x
sur stdout et vers 1
. Par conséquent, je m'attendrais à ce que la sortie finale soit x
, et le fichier 1
contient exactement la chaîne x
.
Cependant, ce n'est pas le cas. En réalité, le fichier 1
contient généralement au moins deux instances x
, et parfois des milliers de lignes de x
s. Lors d'un test par lots d'exécution de la commande dix mille fois, le nombre moyen de x
s écrits dans le fichier était de 52,3 et la médiane était de 1. Quel mécanicien est à l'origine de cela? Quelle distribution de probabilité modélise ce comportement? Je soupçonne qu'il est conditionnellement géométrique et autrement uniforme.
tee
a ouvert le fichier pour l'écriture avant de l'cat
ouvrir pour la lecture, vous pouvez obtenir plusieursx
-es dans le fichier. Dans ce cas, la "boucle" se terminait chaque fois que lacat
lecture était plus rapide que l'tee
écriture, atteignant la fin du fichier.x
s écrits dans le fichier était de 4,35. Je suppose que cela dépendra beaucoup de la charge de la machine.Réponses:
Ceci est très curieux, alors j'ai essayé d'enquêter avec l'aide de Strace. Exécutez votre commande en boucle 1000 fois:
Trouvé le fichier avec le plus de lignes (
wc -l */1 | sort -nr | head -n2
) et vérifié le correspondanttrace.log
. Je peux certainement voir beaucoup de:Où 7567 est
tee 1
et 7568 estcat 1
. Les deux sont définitivement en alternance, alors oui, comme on le soupçonne, il s'agit du moment de l'exécution (et j'imagine le changement de contexte) des deux commandes.la source