bodenloses T-Shirt?

bodenloses T-Shirt?

Ich habe nur im Terminal herumgespielt und Folgendes gemacht:

printf 'some string\n' | {
    tee /dev/fd/3 | {
        : && sed 's/some/string/'
    }
} 3>&0

Ich war wirklich überrascht, als mir auf dem Bildschirm Folgendes angezeigt wurde:

string string
string string
string string
...

Es ging praktisch ewig so weiter. Ich habe es etwas gekürzt. Um es besser zu demonstrieren, versuchen Sie es vielleicht mit Folgendem:

echo | tee /dev/fd/0 | sed =

Bei mir wird eine Ausgabe wie die folgende angezeigt:

<num>
#blank
<num+1>
#blank
...

Und so weiter. Die paar Male, die ich es versucht habe , war ich bei Zeile 200k+, als ich CTRL+ erreichen konnte. Ich habe dies in , , , und und versucht, alle zeigen die gleichen Ergebnisse.Cbashdashshzsh

Was ist da los? Wie werden die Dateideskriptoren |pipezwischen, wie ich dachte, getrennten Prozessen weitergegeben? Ist das zuverlässiges und/oder erwartetes Verhalten? Gibt es andere Möglichkeiten, diesen Effekt zu erzeugen?

Als Referenz:

echo '#blank' | {
    uname -r
    readlink -f /dev/fd/0
    tee /dev/fd/0
} | sed '=;5q'

AUSGABE

1
3.14.6-1-ARCH
2
/proc/24925/fd/pipe:[5851017]
3
#blank
4
#blank
5
#blank

Antwort1

/dev/fd/0ist die Standardeingabe des aktuellen Prozesses; teeschreibt seine Eingabe sowohl in die von Ihnen angegebenen Dateien als auch in stdout. Dasselbe teegilt für das Lesen einer (leeren) Zeile und das anschließende Schreiben dieser Zeile sowohl in stdout ( sed) als auch in die eigene Eingabe, wobei die gerade geschriebene Zeile gelesen, in stdout und in die eigene Eingabe geschrieben usw. wird, wodurch eine Endlosschleife aus (leeren) Zeilen* entsteht. Der sedBefehl druckt nur die Zeilennummer und dann die Zeile.

echo --> tee --> sed
      ^---+

* Wenn mehr als nur ein einfaches Eingabesignal bereitgestellt wird echo, führt dieser Befehl eine Schleife über die Eingabe aus und wiederholt sie immer wieder.

Hinweis: Unter OSX (BSD) ist das Schreiben in nicht möglich /dev/fd/0, daher ist dies nicht möglich.

verwandte Informationen