【发布时间】:2026-01-03 14:35:02
【问题描述】:
我尝试运行一个通过传入管道读取流的 PHP 脚本,我也想管理键盘:cat /etc/passwd|./readSlow.php 该脚本将从管道中读取每个字符并在标准输出上缓慢显示,直到用户按下“q”键(不按 RETURN)。 实际上,脚本读取管道并缓慢显示文本。但是当我按“q”时它并没有停止(它会显示它,我需要在“q”之后按 RETURN 键才能激活停止)。
#!/usr/bin/php
<?php
// ReadSlow
// This tool take a file in input and read it, character by caracter to the
// output.
// It add a sleep time between each character.
// Wait 0.2s between each char
$defaultSpeed = 0.5;
if (($input = fopen ("php://stdin", "r")) === false)
die ("Can not open stdin\n");
if (($keyboard = fopen("/dev/tty", "r")) === false)
die ("Can not open /dev/tty\n");
stream_set_blocking($keyboard, false);
$speed = $defaultSpeed;
while (($char = fgetc ($input)) !== false)
{
if (($key = fgetc ($keyboard)) === "q") // get input from keyboard
break;
usleep ($speed * 1000000);
echo "$char";
}
fclose ($input);
最后我希望有更多可用的密钥。
问题:我应该如何混合标准输入和键盘中的管道(不显示按下的键,不等待返回键)?
我尝试使用“stty”,但每次我都有“stty: 'standard input': Inappropriate ioctl for device”
我在 Linux 上,如果 Bash 有什么改变的话。
谢谢
【问题讨论】: