如何将PHP脚本转义为外部编辑器并在之后返回?

时间:2008-09-24 08:21:52

标签: php shell command-line user-input

具体来说,我有一个PHP命令行脚本,在某个点上需要用户输入。我希望能够执行外部编辑器(例如vi),并等待编辑器在恢复脚本之前完成执行。

我的基本想法是使用临时文件进行编辑,然后检索文件的内容。有点像:

$filename = '/tmp/script_' . time() . '.tmp';

get_user_input ($filename);

$input = file_get_contents ($filename);
unlink ($filename);

我怀疑这不可能来自PHP命令行脚本,但是我希望有一些shell脚本技巧可以用来达到同样的效果。

关于如何在其他脚本语言中实现这一目标的建议也非常受欢迎。

5 个答案:

答案 0 :(得分:9)

您可以将编辑器的输出重定向到终端:

system("vim > `tty`");

答案 1 :(得分:2)

我刚试过这个,它在Windows中工作正常,所以你可以用vi或你想要的任何应用程序复制Linux。

关键是exec()挂起php进程,而记事本(在本例中)正在运行。

<?php

exec('notepad c:\test'); 
echo file_get_contents('c:\test');

?>

$ php -r test.php

编辑:当你的尝试显示并且bstark指出时,我的记事本测试会启动一个新窗口,所以一切都很好,但任何在控制台模式下运行的编辑器都会失败,因为它没有要连接的终端。

话虽这么说,我尝试了一个带有exec('nano test'); echo file_get_contents('test');的Linux机器,它并没有像vi一样糟糕,只是在没有显示任何内容的情况下运行。我可以输入一些东西,按“ctrl-X,y”关闭并保存文件,然后php脚本继续显示我写的内容。无论如何..我找到了正确的解决方案,所以新答案即将出现。

答案 2 :(得分:0)

答案 3 :(得分:0)

我不知道是否可以将vi连接到运行的终端上,但快速简便的解决方案是不要在同一终端上使用屏幕编辑器。

您可以使用ed等行编辑器(您可能不希望这样)或打开一个新窗口,如system(“xterm -e vi”)(将xterm替换为终端应用程序的名称)。

编辑添加:在perl中,系统(“vi”)正常工作,因为perl不会做那种花哨的流水线/缓冲php。

答案 4 :(得分:0)

所以看起来你写一个文件的想法引导我们尝试疯狂的事情,而有一个简单的解决方案:)

<?php

$out = fopen('php://stdout', 'w+');
$in = fopen('php://stdin', 'r+');

fwrite($out, "foo?\n");
$var = fread($in, 1024);
echo strtoupper($var);

fread()调用将挂起php进程,直到它收到某些内容(1024字节或我想到的行尾),产生这个:

$ php test.php
foo?
bar <= my input
BAR