Когда оболочка выполняет внешнюю команду/программу — есть ли у этой программы файловые дескрипторы?

Когда оболочка выполняет внешнюю команду/программу — есть ли у этой программы файловые дескрипторы?

Существует множество документов и обсуждений по файловым дескрипторам оболочек и того, как можно манипулировать этими файловыми дескрипторами для перенаправления и т. д.
Мой вопрос в том, когда команда оболочки является внешней программой, например rsync, cat, curlи т. д., имеют ли эти команды файловые дескрипторы так же, как и оболочка?
Приведу конкретный пример: если я запускаю эту команду в командной строке терминала

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

Я предполагаю, что содержимое этого heredoc передается в STDIN, но какого процесса? Оболочки или у нее catесть файловый дескриптор 0, и содержимое heredoc передается в cat's fd0напрямую?

решение1

Начнем с того, что любой ввод-вывод, будь то файловый, интерактивный или любой другой, требует уникальных файловых дескрипторов для каждого.

Стандартизация интерактивных файловых дескрипторов позволяет осуществлять перенаправление и конвейеризацию.

Оболочка является экспертом в стандартных манипуляциях ввода-вывода.

В вашем примере catвызывается с его STDIN, установленным на вывод оболочки, представляющий ваш скрипт HEREDOC (отправленный через popen()), и с его STDOUT, направленным (с помощью popen()) на phpSTDIN. phpВывод , не перенаправляемый, указывает на начальный STDOUT оболочки.

Связанный контент