PHP (cli) 从/dev/tty 读取时吞下一个字节

标签 php bash tty

我在使用 /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/

相关文章:

linux - 在 Linux 中以编程方式断开并重新连接 ttyUSB0

php - 忽略重复行

php - 如何在服务器上安全地存储文件

linux - 如何在循环的 bash 脚本中引用 "next"命令行参数?

linux - linux/proc/tty/drivers 中没有 VT 驱动程序

shell - pgrep 用于与 Ubuntu 中的终端无关的进程

php - Laravel 中未找到 html 类

php - SQL join into join 创建好数组

linux - 将一个目录下的三个最新文件(递归)复制到另一个指定目录

linux - bash 脚本在后台运行固定数量的作业