shell — поддерживает ли PHP подстановку процессов?

Я пробовал следующие примеры, такие как:

$ php -r 'require_once($argv[1]);' <(echo "hello")

или же:

$ php -r 'file_get_contents($argv[1]);' <(echo "hello")

оба терпят неудачу как:

Предупреждение PHP: require_once (/ dev / fd / 63): не удалось открыть поток: нет такого файла или каталога в коде командной строки в строке 1

Предупреждение PHP: file_get_contents (/ dev / fd / 63): не удалось открыть поток: нет такого файла или каталога в коде командной строки в строке 1

или же:

$ php -r 'file_get_contents($argv[0]);' < <(echo "hello")

который терпит неудачу с:

Неустранимая ошибка PHP: require_once (): не удалось открыть обязательное ‘-‘ (include_path = ‘.: / Usr / share / pear: / usr / share / php’) в коде командной строки в строке 1

Вышеуказанные попытки были вдохновлены drush команда, например:

$ drush --early=<(echo print 123';') ""[warning] require_once(/dev/fd/63): failed to open stream: No such file or directory preflight.inc:58

где я мог бы вставить динамический PHP-код из файлового дескриптора (без создания отдельного файла каждый раз), чтобы выполнить код перед загрузкой основного кода.


Другие подобные командные инструменты работают правильно:

$ cat <(echo "hello")
hello

или же:

$ python -c "import sys; print sys.stdin.readlines()" < <(echo "hello")
['hello\n']

Я нашел это Ошибка PHP а также этот, но это было исправлено давно, и я использую 5.6.22.

Есть ли способ, которым я могу обмануть PHP для чтения данных из процесса подстановки (для чтения из файлового дескриптора, например, /dev/fd) когда вызывается из CLI, используя какой-то простой однострочник?

1

Решение

Сообщение об ошибке дает хороший совет: PHP не может найти данный файл.

Но подождите, какой файл? Ну давай вспомним что процесс замены является:

Подстановка процесса — это форма перенаправления, в которой ввод или вывод процесса (некоторая последовательность команд) отображается в виде временного файла.

Итак, вы видите, когда вы печатаете аргумент, который вы предоставляете следующим образом:

$ php -r 'print $argv[1];' <(echo "a")

Мне он возвращает следующий временный файл:

/dev/fd/63

Так что да, вы можете использовать процесс подстановки с помощью PHP, но не для этого.

Если вы хотите использовать вывод команды в качестве аргумента, просто используйте $() расширить его:

$ php -r 'print $argv[1];' "$(echo "hello man")"hello man
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]