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
, curl
usw., 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 cat
einen Dateideskriptor und der Inhalt des Heredocs wird direkt an 's 0
weitergeleitet ?cat
fd0
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 cat
wird 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 php
das STDIN von weitergeleitet wird. Wenn php
die Ausgabe von nicht umgeleitet wird, zeigen Sie auf das anfängliche STDOUT der Shell.