6

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

我的基本想法是使用临时文件进行编辑,然后检索文件的内容。类似于以下内容:

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

get_user_input ($filename);

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

我怀疑这在 PHP 命令行脚本中是不可能的,但是我希望有某种 shell 脚本技巧可以用来实现相同的效果。

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

4

5 回答 5

9

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

system("vim > `tty`");
于 2008-09-24T21:19:33.753 回答
2

我刚刚尝试过,它在 Windows 中运行良好,因此您可以在 Linux 上使用 vi 或任何您想要的应用程序进行复制。

关键是exec()在记事本(在这种情况下)运行时挂起 php 进程。

<?php

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

?>

$ php -r test.php

编辑:正如您的尝试和 bstark 指出的那样,我的记事本测试会启动一个新窗口,所以一切都很好,但是任何在控制台模式下运行的编辑器都会失败,因为它没有可以附加的终端。

话虽如此,我在一个 Linux 机器上尝试过exec('nano test'); echo file_get_contents('test');,它并没有像 vi 那样失败,它只是运行而不显示任何东西。我可以输入一些东西,按“ctrl-X, y”关闭并保存文件,然后 php 脚本继续显示我写的内容。无论如何..我找到了正确的解决方案,所以新的答案进来了。

于 2008-09-24T08:30:48.093 回答
0
system('vi');

http://www.php.net/system

于 2008-09-24T08:29:55.023 回答
0

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

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

编辑添加:在 perl 中,system("vi") 可以正常工作,因为 perl 不做 php 做的那种花哨的流水线/缓冲。

于 2008-09-24T10:56:35.670 回答
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
于 2008-09-24T11:41:41.567 回答