1

我正在尝试以下示例,例如:

$ 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(): Failed opening required '-' (include_path='.:/usr/share/pear:/usr/share/php') in Command line code on line 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。

当从 CLI 调用时,有什么方法可以欺骗 PHP 从进程替换中读取数据(例如,从文件描述符中读取/dev/fd),通过使用一些简单的单线?

4

1 回答 1

1

错误消息给出了一个很好的提示:PHP 找不到给定的文件。

但是等等,什么文件?好吧,让我们记住什么是进程替换

进程替换是一种重定向形式,其中进程的输入或输出(某些命令序列)显示为临时文件。

因此,当您打印以这种方式提供的参数时,您会看到:

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

对我来说,它返回以下临时文件:

/dev/fd/63

所以是的,你可以使用 PHP 的进程替换,但不是为了这个。

如果您想要使用命令的输出作为参数,只需使用$()来扩展它:

$ php -r 'print $argv[1];' "$(echo "hello man")"
hello man
于 2016-08-08T14:04:39.333 回答