当尝试从 Linux shell 执行 PHP 解释器时,使用 -B 选项,执行提供的 begin_code 但进程阻塞并且主脚本 (
f2.php
) 未执行。
问题复现:
$ php -v
PHP 8.1.13 (cli) (built: Nov 22 2022 14:42:07) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies
$ cat f2.php
<?php
echo "f2 running.\n";
?>
$ php f2.php
f2 running.
$ php -B 'echo "init\n";' f2.php
init
壳块。然后我必须使用 ctrl+C 返回到提示符。 我希望脚本
f2.php
也被执行。
我做错了什么?
我从来没有尝试过这个,但是我解释精美手册的方式
-B
只有当代码来自STDIN
而不是来自文件时才有效?
也可以使用参数逐行处理标准输入 -R 或 -F。在这种模式下,每个单独的输入行都会产生由 -R 或 要执行的 -F 指定的文件。您可以通过 $argn 访问输入行。尽管 处理输入行 $argi 包含正在处理的实际行数。 此外,参数 -B 和 -E 可用于在和之前执行代码(请参阅 -r) 在分别处理完所有输入行之后。 注意输入是从 STDIN 因此从 STDIN 读取显式更改下一个输入行或跳过 输入线。
上面的重点是我的。
也许试试:
cat f2.php | php -B'echo "init\n";
当使用
-B
参数时,PHP进入交互模式。要执行 f2.php
,您需要添加 -F
参数,但它只会在您按下 ENTER 键后运行您的脚本:
me:~$ php -B 'echo "init\n";' -F f2.php
init
<ENTER>
f2 running.
<ENTER>
f2 running.
^C
me:~$
要“欺骗”PHP 进入非交互模式,请将某些内容输入
php
命令。然后 PHP 将运行初始化代码和您的脚本,然后终止:
me:~$ echo | php -B 'echo "init\n";' -F f2.php
init
f2 running.
me:~$