如何解决使用输入管道和管理键盘
我尝试运行通过传入管道读取流的 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:'标准输入':设备的 ioctl 不合适”
我在 Linux 上使用 Bash,如果它改变了什么。
谢谢
解决方法
问题是stdin和tty是同一个输入通道。如果你不用管道就可以逃脱,请通过“./readSlow.php /etc/passwd”尝试下面的代码。这需要将要打印的文件作为命令行参数。命令“stty -echo”抑制按下按键的输出。
#!/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 ($argv[1],"r")) === false)
die ("Can not open $argv[1]\n");
if (($keyboard = fopen("/dev/tty","r")) === false)
die ("Can not open /dev/tty\n");
stream_set_blocking($keyboard,false);
system("stty -echo");
$speed = $defaultSpeed;
while (($char = fgetc ($input)) !== false)
{
if (($key = fgetc ($keyboard)) === "q") // get input from keyboard
break;
usleep ($speed * 1000000);
echo "$char";
}
fclose ($input);
echo "\n";
system("stty echo");
,
你很接近。默认情况下,Unix 上的终端/控制台又名“tty”设备以一次一行模式工作,让您有机会纠正小的打字错误。您需要将其关闭,而 stty
是这样做的好方法——但 stty
在其标准输入上运行,并且您已重定向标准输入(使用管道),因此您需要将其重定向回stty
。在程序开始时尝试 system("stty </dev/tty raw")
,类似地但在最后使用 -raw
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。