Wenn eine Shell einen externen Befehl/ein externes Programm ausführt – verfügt dieses Programm über Dateideskriptoren?

Wenn eine Shell einen externen Befehl/ein externes Programm ausführt – verfügt dieses Programm über Dateideskriptoren?

Es gibt viele Dokumente und Diskussionen zu den Dateideskriptoren von Shells und wie diese Dateideskriptoren für Umleitungen usw. manipuliert werden können.
Meine Frage ist, wenn ein Shell-Befehl ein externes Programm ist, wie rsync, cat, curlusw., haben diese Befehle dann die gleichen Dateideskriptoren wie die Shell?
Um ein konkretes Beispiel zu geben: Wenn ich diesen Befehl an einer Terminal-Eingabeaufforderung ausführe

% cat << EOF | php
<?php
echo "hello". PHP_EOL;
echo "another line" . PHP_EOL;
EOF

Ich gehe davon aus, dass der Inhalt dieses Heredocs an STDIN weitergeleitet wird, aber an welchen Prozess? Die Shell, oder hat es cateinen Dateideskriptor und der Inhalt des Heredocs wird direkt an 's 0weitergeleitet ?catfd0

Antwort1

Beginnen wir mit der Feststellung, dass für alle E/A-Vorgänge, egal ob dateibasiert, interaktiv oder auf andere Weise, jeweils eindeutige Dateideskriptoren erforderlich sind.

Die Standardisierung interaktiver Dateideskriptoren ermöglicht Umleitung und Piping.

Die Shell ist ein Experte für Standard-E/A-Manipulationen.

In Ihrem Beispiel catwird aufgerufen, wobei sein STDIN auf die Ausgabe der Shell eingestellt ist, die Ihr HEREDOC-Skript darstellt (gesendet über ein popen()), und wobei sein STDOUT (mit popen()) an phpdas STDIN von weitergeleitet wird. Wenn phpdie Ausgabe von nicht umgeleitet wird, zeigen Sie auf das anfängliche STDOUT der Shell.

verwandte Informationen