我正在尝试以下示例,例如:
$ 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():在第1行的命令行代码中打开所需的' - '(include_path ='。:/ usr / share / pear:/ usr / share / php')失败
上述尝试受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 bug和this one,但这些已经很久以前修复了,我使用的是5.6.22。
有什么方法可以让我通过使用一些简单的单行程序来欺骗PHP从进程替换中读取数据(从文件描述符中读取,例如/dev/fd
),使用一些简单的单行程序?
答案 0 :(得分:1)
错误消息提供了一个很好的提示:PHP无法找到给定的文件。
但等等,什么文件?好吧,让我们记住process substitution是什么:
进程替换是一种重定向形式,其中进程的输入或输出(某些命令序列)显示为临时文件。
因此,当您打印出以这种方式提供的参数时,您会看到:
$ php -r 'print $argv[1];' <(echo "a")
对我而言,它返回以下临时文件:
/dev/fd/63
所以是的,您可以使用PHP替换进程,但不能用于此。
如果你想要的是使用命令的输出作为参数,只需使用$()
来扩展它:
$ php -r 'print $argv[1];' "$(echo "hello man")"
hello man