【发布时间】:2019-09-03 05:49:01
【问题描述】:
我正在尝试实现一种可用于调用 shell 脚本或程序的 PHP 方法。使用反引号本身就很容易,但是我只有在脚本/程序完成时才能得到输出,这 不是 我需要的。
所以我切换到使用popen(),所以我在输出时打印它。现在工作正常,但我遇到了下一个我找不到工作解决方案的问题:处理来自的提示被调用的脚本/程序。我的项目的本质是,我无法预先知道脚本是否需要用户输入,因此无法自动回答提示。例如,apt-get update ; apt-get upgrade 之类的脚本可能会触发我不知道也不想自动为用户回答的用户提示。
目前我正在使用我在StackOverflow找到的这件作品:
static public function command($cmd)
{
$cwd = getcwd();
$proc = proc_open($cmd, [['pipe','r'],['pipe','w'],['pipe','w']], $pipes, $cwd);
while(($line = fgets($pipes[1])) !== false)
{
fwrite(STDOUT,$line);
}
while(($line = fgets($pipes[2])) !== false)
{
fwrite(STDERR,$line);
}
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
return proc_close($proc);
}
它可以很好地输出,但是一旦脚本提示用户(例如使用read -p "What's your poison?"),我就没有输出,也无法输入任何内容。起初我认为这可能与未进一步处理 STDIN 管道有关,但我不知道如何正确设置它。
有人可以指导我如何实现支持用户提示而不是自动回答用户提示的正确方向吗?
【问题讨论】:
-
apt-get的输出可能在写入管道时被缓冲。 -
我在使用
read -p "What's your poison?" answer之类的简单脚本时遇到了同样的问题,实际上在使用read的任何脚本中都遇到了同样的问题。