【问题标题】:PHP (cli) swallows a byte when reading from /dev/ttyPHP (cli) 从 /dev/tty 读取时吞下一个字节
【发布时间】:2016-01-10 21:51:38
【问题描述】:

我在使用/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";
?>
$

注意:第一个字符&lt; 只是丢失了,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 版本,以及有关操作系统的详细信息。
  • 我用 php 5.6.10 尝试了上述方法,它表现出相同的行为 - &lt; 被“吃掉”了。

标签: php bash tty


【解决方案1】:

php /dev/tty \<?php echo "hi\n"; ?> hi

转义&lt; 有效。我不知道为什么:D 可能与这是在 bash 中运行的事实有关。

【讨论】:

  • 可能是因为第一个字符被吞掉了,你可以把anything放在那里...!?
  • @deceze 是的,这也可能是真的 :)
猜你喜欢
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多