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.