[英]How to NOT print a trailing newline after echo “<something>”
对于命令行应用程序,我试图使用以下代码来询问一个简单的问题(示例不是现实生活中的代码,但类似于“真实”版本):
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 '...'
等效项(不打印尾随的换行符)。
要了解为什么会这样-您需要了解程序中涉及两件事: 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的OS的解决方案。 在Win中-祝您好运。 您可以在此页面上查看控制台模式和相关内容,但是我不确定它是否可以正常运行(因为尚未测试)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.