对于命令行应用程序,我试图使用以下代码提出一个简单的问题(示例不是现实生活,代码,但类似于“真实”版本):
echo "Do you want to quit? [Y]/N";
$handle = fopen ( "php://stdin", "r" );
$input = trim(fgets($handle));
if ( empty($input) ) {
$input = 'Y';
echo "Y\n";
}
我想要的结果如下 - 当用户执行-NOT-提供输入时:
Do you want to quit? [Y]/N: N // User only hits enter, not 'N'..
我得到的是:
Do you want to quit? [Y]/N: // User only hits enter, not 'N'..
N
所以问题是:如何强制echo 'Something';
在回声后不打印换行符。
基本上我需要等同于bash的echo -n '...'
(不打印尾随换行符)。
答案 0 :(得分:2)
要理解为什么会如此 - 您需要了解有两件事:STDIN
和STDOUT
参与计划。并且 - 是的,php 不会添加新行。使用简单的echo "foo";
,您将获得完全 "foo"
,而无需换行。
但为什么你会看到新线?简单:因为你按了“它”。那就是:你按下了“输入”键,终端得到了它,打印它。当然,你的程序也得到了它,但在那一刻,“密钥”已经已经打印。
你能做什么?在那一步:没有。它已经完成了就是这样。你会在屏幕上看到它。但是,是的,我可以建议一个技巧。当您可以控制输入和/或输出时,可以使用stty
来维护行为。结合system()
,您就会明白这一点。
我们这里有代码:
function emulatePrintable()
{
$result = '';
while($c = trim(fgetc(STDIN)))
{
echo($c);
$result.=$c;
}
return $result;
}
system('stty -echo');
echo("Do you want to quit? [Y]/N ");
$result = emulatePrintable();
if($result==='')
{
echo("You didn't type anything!");
}
echo "\n"; //<--- this is to delimit program's end of work
system('stty echo');
发生了什么事?你这样做了:
stty -echo
禁止任何输入打印。这是诀窍。您只能屏蔽输入显示,而不是输出显示。这就是为什么你能够从PHP echo()
字符串的原因
Y
或N
) - 但您想要跳过新行。简单emulatePrintable()
将完成工作(可能不是最好的名字,但至少我已经尝试过了)stty echo
启用输入显示 - 否则..好吧,你将以“非工作”终端结束。好处:通过这个,您甚至可以决定是否打印字符(例如,仅限 Y
和N
输出。
所以这是基于unix的操作系统的解决方案。在胜利 - 祝你好运。您可以查看this page的控制台模式&amp;相关的东西,但我不确定它会起作用(因为没有经过测试)。