Betrachten Sie den folgenden Befehl :
bash -c "echo x; cat 1" | tee 1
.
Mein Verständnis ist, dass es in eine neue Shell x
verzweigen, in stdout schreiben, file 1 not found
in stderr schreiben , die Steuerung beenden und an den übergeordneten Prozess zurückgeben und x
in stdout und in schreiben würde 1
. Daher würde ich erwarten, dass die endgültige Ausgabe x
erfolgt und die Datei 1
genau die Zeichenfolge enthält x
.
Dies ist jedoch nicht der Fall. Tatsächlich 1
enthält die Datei normalerweise mindestens zwei Instanzen von x
und manchmal Tausende von Zeilen von x
s. Bei einem Batch-Test, bei dem der Befehl zehntausend Mal ausgeführt wurde, x
betrug die durchschnittliche Anzahl der in die Datei geschriebenen s 52,3 und der Median 1. Welcher Mechaniker verursacht dies? Welche Wahrscheinlichkeitsverteilung modelliert dieses Verhalten? Ich vermute, dass es bedingt geometrisch und ansonsten einheitlich ist.
tee
die Datei zum Schreiben geöffnet wurde, bevorcat
sie zum Lesen geöffnet wurde, enthält die Datei möglicherweise vielex
-es. In diesem Fall würde die "Schleife" immer dann enden, wenn dascat
Lesen schneller als dastee
Schreiben erfolgt und das Ende der Datei erreicht.x
betrug die durchschnittliche Anzahl der in die Datei geschriebenen s 4,35. Ich denke, es wird sehr von der Maschinenlast abhängen.Antworten:
Dies ist eine sehr merkwürdige Sache, deshalb habe ich versucht, sie mit Hilfe von Strace zu untersuchen. Führen Sie Ihren Befehl 1000 Mal in einer Schleife aus:
Fand die Datei mit den meisten Zeilen (
wc -l */1 | sort -nr | head -n2
) und überprüfte die entsprechendetrace.log
. Ich kann sicherlich viele sehen:Wo 7567 ist
tee 1
und 7568 istcat 1
. Die beiden wechseln sich definitiv ab, also dreht sich, wie vermutet, alles um den Zeitpunkt der Ausführung (und ich stelle mir eine Kontextumschaltung vor) der beiden Befehle.quelle