Существует множество документов и обсуждений по файловым дескрипторам оболочек и того, как можно манипулировать этими файловыми дескрипторами для перенаправления и т. д.
Мой вопрос в том, когда команда оболочки является внешней программой, например 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()) на php
STDIN. php
Вывод , не перенаправляемый, указывает на начальный STDOUT оболочки.