我正在编写一个能够从stdin读取然后请求确认的脚本。
<?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和键盘读取?
感谢。
答案 0 :(得分:6)
STDIN
使用fgetc功能。见下文的例子。
$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
答案 1 :(得分:3)
根据评论者的说法,PHP页面(http://php.net/manual/en/book.readline.php):
启用readline后,php会将终端模式切换为accept 行缓冲输入。这意味着使用cli的正确方法 管道到交互式命令时要明确指定 php没有使用终端输入:
php somescript.php&lt; / dev / null |少
我认为重点是追加| less
。不知道数据的结构,可能需要在脚本中完成一些事情来处理从数据到确认的转换。
可能会添加一种机制来检测何时启用终端线路缓冲输入。