繁体   English   中英

如何在回显后不打印尾随换行符“ <something> ”

[英]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 '...'等效项(不打印尾随的换行符)。

要了解为什么会这样-您需要了解程序中涉及两件事: STDINSTDOUT 并且-是的,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()字符串的原因
  • 模拟可打印字符的输出。 也就是说:您仍然想显示用户正在输入什么(您的YN )-但您想跳过新行。 简单的emulatePrintable()完成工作(可能不是最好的名称,但至少我已经尝试过了)
  • 获得输入后(例如,它被EOL中断)-您可以检查它是什么。 如果它是一个空字符串,则说明您已捕获它:用户未键入任何内容。
  • 现在,不要忘了用stty echo启用输入显示-否则,您将以“非工作”终端结束。

好处:这样,您甚至可以决定是否打印字符(例如, 限制输出的YN )。

因此,这是基于unix的OS的解决方案。 在Win中-祝您好运。 您可以在此页面上查看控制台模式和相关内容,但是我不确定它是否可以正常运行(因为尚未测试)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM