Я пробовал следующие примеры, такие как:
$ 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, используя какой-то простой однострочник?
Сообщение об ошибке дает хороший совет: PHP не может найти данный файл.
Но подождите, какой файл? Ну давай вспомним что процесс замены является:
Подстановка процесса — это форма перенаправления, в которой ввод или вывод процесса (некоторая последовательность команд) отображается в виде временного файла.
Итак, вы видите, когда вы печатаете аргумент, который вы предоставляете следующим образом:
$ php -r 'print $argv[1];' <(echo "a")
Мне он возвращает следующий временный файл:
/dev/fd/63
Так что да, вы можете использовать процесс подстановки с помощью PHP, но не для этого.
Если вы хотите использовать вывод команды в качестве аргумента, просто используйте $()
расширить его:
$ php -r 'print $argv[1];' "$(echo "hello man")"hello man
Других решений пока нет …