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
, cat
etc. 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 cat
tiene un descriptor de archivo 0
y 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, cat
se 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 php
STDIN de . php
La salida de no se redirige, apunte al STDOUT inicial del shell.