Quando um shell executa um comando/programa externo - esse programa possui descritores de arquivo?

Quando um shell executa um comando/programa externo - esse programa possui descritores de arquivo?

Existem muitos documentos e discussões sobre os descritores de arquivos de shells e como esses descritores de arquivos podem ser manipulados para redirecionamento, etc.
Minha pergunta é: quando um comando shell é um programa externo, como rsync, cat, curletc, esses comandos têm descritores de arquivo em da mesma forma que o shell faz?
Para dar um exemplo concreto, se eu executar este comando em um prompt de terminal

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

Presumo que o conteúdo deste heredoc esteja sendo enviado ao STDIN, mas de qual processo? o shell, ou cattem um descritor de arquivo 0e o conteúdo do heredoc está sendo alimentado catdiretamente fd0?

Responder1

Vamos começar dizendo que todas as E/S, sejam elas baseadas em arquivos, interativas ou de qualquer outra forma, requerem descritores de arquivo exclusivos para cada uma.

A padronização de descritores de arquivos interativos é o que permite o redirecionamento e o pipe.

O shell é especialista em manipulações de E/S padrão.

No seu exemplo, caté chamado com seu STDIN definido para a saída do shell que representa seu script HEREDOC (enviado por meio de a popen()) e com seu STDOUT canalizado (com popen()) para phpo STDIN de. phpA saída de não está sendo redirecionada, aponte para o STDOUT inicial do shell.

informação relacionada