我在使用 /dev/tty
时遇到 PHP (cli) 问题作为文件。实际场景稍微复杂一些,为简单起见,此处不再赘述。
要从 STDIN 运行 PHP 代码,我可以按如下方式运行命令,
$ php
<?php
echo "hello world\n";
?>
<CTRL-D>
hello world
$
但是,当运行通过/dev/tty
,会发生以下情况,
$ php /dev/tty
<?php
echo "hello world\n";
?>
<CTRL-D>
?php
echo "hello world\n";
?>
$
注意:第一个字符<
只是丢失并且 php 将输入处理为纯文本。我们可以将测试简化为以下内容,
工作
$ php
abcd
abcd
$
不工作
$ php /dev/tty
abcd
bcd
$
我已经跑了 strace
检查 php 是否正确读取输入,似乎是这样,如下所示,
$ strace -o /tmp/1 php /dev/tty ; grep "bcd" /tmp/1
abcd
<CTRL-D>
bcd
read(4, "abcd\n", 4096) = 5
write(1, "bcd\n", 4) = 4
$
这看起来很简单,我觉得我在这里遗漏了一些非常基本的东西。
有谁知道为什么 PHP (cli) 在读取/dev/tty 时会这样?
附加信息:-
- PHP 版本:5.3.3 (cli) 和 5.5.20 (cli)
- 操作系统:Linux(CentOS 6.4 和 Fedora 19)
最佳答案
php /dev/tty
\<?php
echo "hi\n";
?>
hi
转义 <
工作了。我不知道为什么 :D 可能与这是在 bash 中运行的事实有关。
关于PHP (cli) 从/dev/tty 读取时吞下一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33097704/