![Quando um shell executa um comando/programa externo - esse programa possui descritores de arquivo?](https://rvso.com/image/88791/Quando%20um%20shell%20executa%20um%20comando%2Fprograma%20externo%20-%20esse%20programa%20possui%20descritores%20de%20arquivo%3F.png)
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
, curl
etc, 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 cat
tem um descritor de arquivo 0
e o conteúdo do heredoc está sendo alimentado cat
diretamente 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 php
o STDIN de. php
A saída de não está sendo redirecionada, aponte para o STDOUT inicial do shell.