我正在尝试实现一种可用于调用Shell脚本或程序的PHP方法。这本身很容易用反引号括起来,但是我只有在脚本/程序完成时才得到输出,这不是我所需要的。
所以我改用popen()
,所以我打印输出结果。现在效果很好,但是我遇到了下一个问题,我找不到有效的解决方案:handle从被调用的脚本/程序中进行提示。我项目的本质是使我无法预先知道脚本是否需要用户输入,因此无法自动回答提示。例如,诸如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管道没有得到进一步处理有关,但我不知道如何正确设置它。
有人可以在正确的方向上指导我,使实现看起来像支持用户提示而不是自动回答吗?
答案 0 :(得分:0)
事实证明,有一个更简单的解决方案:只需使用passthru()
函数,它就可以正确处理用户提示并实时输出。