Cuando un Shell ejecuta un comando/programa externo, ¿ese programa tiene descriptores de archivos?

Cuando un Shell ejecuta un comando/programa externo, ¿ese programa tiene descriptores de archivos?

Hay muchos documentos y debates sobre los descriptores de archivos de los shells y cómo se pueden manipular esos descriptores de archivos para la redirección, etc.
Mi pregunta es, cuando un comando de shell es un programa externo, como rsync, catetc. curl, ¿esos comandos tienen descriptores de archivos en ¿De la misma manera que lo hace el caparazón?
Para dar un ejemplo concreto, si ejecuto este comando en el símbolo del terminal

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

Supongo que el contenido de este documento heredoc se envía a STDIN, pero ¿de qué proceso? el shell, o cattiene un descriptor de archivo 0y el contenido del heredoc se envía directamente a cat's fd0?

Respuesta1

Comencemos diciendo que todas las E/S, ya sean basadas en archivos, interactivas o de cualquier otra forma, requieren descriptores de archivos únicos para cada una.

La estandarización de los descriptores de archivos interactivos es lo que permite la redirección y la canalización.

El shell es un experto en manipulaciones de E/S estándar.

En su ejemplo, catse llama con su STDIN configurado en la salida del shell que representa su script HEREDOC (enviado a través de popen()) y con su STDOUT canalizado (con popen()) al phpSTDIN de . phpLa salida de no se redirige, apunte al STDOUT inicial del shell.

información relacionada