Ich versuche, Named Pipes im Kontext dieses speziellen Beispiels zu verstehen.
Ich tippe <(ls -l)
in meinem Terminal und erhalten die Ausgabe als, bash: /dev/fd/63: Permission denied
.
Wenn ich tippe cat <(ls -l)
, könnte ich den Verzeichnisinhalt sehen. Wenn ich die ersetzen cat
mit echo
, ich glaube , ich die Terminalnamen bekommen (oder ist es?).
echo <(ls -l)
gibt die Ausgabe als /dev/fd/63
.
Auch diese Beispielausgabe ist mir unklar.
ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]
Wenn ich jedoch gebe, ls -l <()
listet es mir den Verzeichnisinhalt auf.
Was passiert bei der Named Pipe?
mkfifo
Erstellt nur die Named Pipe ohne Inhalt. Sie müssen also selbst schreiben (zmkfifo mypipe; ls > mypipe
. B. ). Und ja, die Schreibvorgänge in die Pipe werden blockiert, bis ein Prozess aus der Pipe liest./dev/fd/63
ist eine anonyme Pipe.file <(ls)
. Die Shell erstellt zwar eine anonyme Pipe, der Dateideskriptor wird jedoch als Named Pipe in dargestellt/dev/fd
. Wenn es sich um eine anonyme Pipe handeln würde, hätte sie keinen Namen und könnte nicht von einem Befehl geöffnet werden, an den sie übergeben/dev/fd/63
wird./dev/fd
können auf jede Datei verweisen Deskriptor, sogar anonyme Pipes und Sockets, Netzwerk-Sockets, Shared-Memory-Segmente usw.Sie verstehen den
ls
Befehl und die Umleitung falsch .ls
listet die Dateien und Verzeichnisse auf, die in der Kommandozeile angegeben sind. Ich glaube nicht, dass es Eingaben von stdin akzeptiert. Umleitung>
>>
und<
sind Möglichkeiten, eine Datei zu verwenden, um Eingaben zu machen und Ausgaben zu sammeln.quelle
<(…)
ist eine Prozessersetzung.x|y
und fast identisch mit[num]<<REDIRECT
einigen Muscheln. Wo es sich unterscheidet, ist die wörtliche Ersetzung der fd-Verknüpfung durch die Shell -/dev/fd/63
und so weiter - und was sie mit stdin macht - oder nicht macht. Machen Sie es sich selbstecho | readlink /dev/fd/0
und überzeugen Sie sich.dev
Link - eine spezielle Datei. Sie können dasselbe mit jedem Dateideskriptor auf den meisten Linux-Systemen tun - sogar typisch|pipes
, obwohl ich nicht für das Verhalten an anderer Stelle bürge. Ich verstehe, woher du kommst, aber eine Named Pipe ist eine eigenständige Sache - es ist eine Dateisystemreferenz auf eine In-Kernel-Pipe - eine reguläre Dateisystemreferenz, keine Gerätedatei./dev/fd/*
dass eine Named Pipe an einer anderen Stelle erstellt wird. Aber ich gehe davon aus, dass es/dev/fd/*
sich um einen anderen Mechanismus als eine eigentliche Named Pipe handelt. Übrigens könnte die Beschreibung von Wikipedia eine Erklärung für diese Unterscheidung gebrauchen./dev/fd/*
es nicht verfügbar ist, erstellt bash eine Named Pipe/tmp
und verwendet diese stattdessen für die Prozessersetzung. Kommt mir nicht so komisch vor, nur die Funktionalität in so vielen Umgebungen wie möglich verfügbar zu machen.