如何在echo&#34; <something>&#34; </something>之后不打印尾随换行符

时间:2014-04-29 09:40:36

标签: php command-line

对于命令行应用程序,我试图使用以下代码提出一个简单的问题(示例不是现实生活,代码,但类似于“真实”版本):

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 '...'(不打印尾随换行符)。

1 个答案:

答案 0 :(得分:2)

要理解为什么会如此 - 您需要了解有两件事: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的操作系统的解决方案。在胜利 - 祝你好运。您可以查看this page的控制台模式&amp;相关的东西,但我不确定它会起作用(因为没有经过测试)。