it-swarm.com.de

Warum führt die Prozessersetzung zu einer Datei namens / dev / fd / 63, die eine Pipe ist?

Ich versuche, Named Pipes im Kontext dieses speziellen Beispiels zu verstehen.

Ich tippe <(ls -l) in mein Terminal und erhalte die Ausgabe als bash: /dev/fd/63: Permission denied.

Wenn ich cat <(ls -l) eingebe, kann ich den Verzeichnisinhalt sehen. Wenn ich cat durch echo ersetze, erhalte ich wahrscheinlich den Terminalnamen (oder doch?).

echo <(ls -l) gibt die Ausgabe als /dev/fd/63 aus.

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 ls -l <() gebe, werden mir die Verzeichnisinhalte aufgelistet.

Was passiert bei der genannten Pipe?

42
Ramesh

Wenn Sie <(some_command) ausführen, führt Ihre Shell den Befehl in Klammern aus und ersetzt das Ganze durch einen Dateideskriptor, der mit der Standardausgabe des Befehls verbunden ist. /dev/fd/63 Ist also eine Pipe, die die Ausgabe Ihres ls-Aufrufs enthält.

Wenn Sie <(ls -l) ausführen, wird ein Permission denied - Fehler angezeigt, da die gesamte Zeile durch die Pipe ersetzt wird und effektiv versucht wird, /dev/fd/63 Als Befehl aufzurufen, der nicht ausführbar ist.

In Ihrem zweiten Beispiel wird cat <(ls -l) zu cat /dev/fd/63. Wenn cat aus den als Parameter angegebenen Dateien liest, erhalten Sie den Inhalt. echo gibt dagegen nur seine Parameter "wie sie sind" aus.

Der letzte Fall, <(), wird einfach durch nichts ersetzt, da es keinen Befehl gibt. Dies ist jedoch zwischen den Shells nicht konsistent. In zsh erhalten Sie immer noch eine Pipe (obwohl leer).

Zusammenfassung : Mit <(command) können Sie die Ausgabe eines Befehls verwenden, für den Sie normalerweise eine Datei benötigen würden.

Edit : as Gilles weist darauf hin, dass dies keine Named Pipe ist, sondern eine anonyme Pipe. Der Hauptunterschied besteht darin, dass es nur existiert, solange der Prozess ausgeführt wird, während eine Named Pipe (die beispielsweise mit mkfifo erstellt wurde) ohne damit verbundene Prozesse verbleibt.

38
crater2150