PHP readline (), когда STDIN отличается от клавиатуры - PullRequest
4 голосов
/ 28 февраля 2012

Я пишу скрипт, который может читать со стандартного ввода, а затем запрашивать подтверждение.

<?php
$stream = fopen('php://stdin', 'r');
$input = fgets($stream, 1024);
$confirmation = readline('Are you sure?');
if ( $confirmation == 'y' )
    /* Do dangerous stuff */

Когда я запускаю его напрямую:

$ php script.php
inputdata
^D
Are you sure?

Но я пытаюсь запустить его, используя файл в качестве STDIN. В этом случае readline () возвращает false и подтверждение не запрашивается.

$ php script.php < data.txt

или

$ echo "foobar" | php script.php

Как я могу читать как с STDIN, так и с клавиатуры при вызове этого сценария таким образом?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 28 февраля 2012

Используйте функцию fgetc с STDIN.См. Пример ниже.

$input = fgets(STDIN, 1024);
echo "\nAre you sure?\n";
$conf = fgetc(STDIN);
if($conf=='y'){
        echo "Great! Lets go ahead\n";
}else{
        echo "Okay, May be next time\n";
}

Вывод на консоль

Образец 1

    $ echo 'data
    > y
    > ' | php php_readline.php

    Are you sure? 
    Great! Lets go ahead

Образец 2

$ php php_readline.php 
Some data

Are you sure?
n
Okay, May be next time
3 голосов
/ 28 февраля 2012

В соответствии с комментарием на странице PHP (http://php.net/manual/en/book.readline.php):

Когда readline включен, php переключает режим терминала для приема ввода с буферизацией строки.Это означает, что правильный способ использования cli при передаче по конвейеру к интерактивной команде - явно указать, что php не использует терминал для ввода:

php somescript.php </ dev / null |меньше </p>

Я считаю, что смысл добавить | less.Не зная структуры ваших данных, возможно, что-то может потребоваться сделать в вашем скрипте, чтобы обработать переход от данных к подтверждению.

Можно добавить механизм для обнаружения, когда включен ввод с буферизацией строки терминала.

...