7

我有以下代码:

        $process = new Process('vi');

        尝试 {
            $process->setPty(true);
            $process->mustRun(function ($type, $buffer) {
                回声$缓冲区;
            });
            //回显 $process->getOutput();
        } 捕捉(ProcessFailedException $e){
            回声 $e->getMessage();
        }

但是,它因以下信息而死:

命令“vi”失败。

退出代码:1(一般错误)

工作目录:[路径]

输出:
=================
Vim:读取输入时出错,正在退出...
维姆:完成。


错误输出:
=================
Vim:警告:输出不是终端
Vim:警告:输入不是来自终端

更新

似乎有些人不清楚我要做什么。我会解释。此脚本正在控制台中运行。同样的事情通过 passthru 起作用(尽管 Vim 仍然警告输出)。我想要一个交互式过程,允许用户在将某些文件发送到某个地方之前对其进行修改。我不想实现自己的编辑器,这就是我希望他们使用 vi 的原因。vi 在我的服务器上可用(从我提供的输出中可以清楚地看到)。

4

3 回答 3

6

在这里,我得到了正确的答案:https ://github.com/symfony/symfony/issues/19528

基本上,我不得不使用$process->setTty(true). 因此,完整的示例将是:

    $process = new Process('vi');

    try {
        $process->setTty(true);
        $process->mustRun(function ($type, $buffer) {
            echo $buffer;
        });
    } catch (ProcessFailedException $e) {
        echo $e->getMessage();
    }
于 2016-08-04T20:05:09.870 回答
0

顺便说一句,你的问题完全有道理..

我的想法是:

  • 你得到一个退出代码:1 --> 这意味着没有指定要编辑的文件名。虽然我可能是错的。
  • 它显示“工作目录:[路径]”。这告诉我,也许路径丢失了。
  • 另外,我不知道哪个用户(在系统上)运行 Symfony 进程组件。

所以也许尝试:

$process = new Process('vi /tmp/temp.file');

使用 /tmp 因为任何人都应该有权访问,也可能是可写的 Web 文件夹。另一个想法是使用 sudo 运行该进程并指定用户 vimrc:

$process = new Process('sudo vim -u ~user/.vimrc /tmp/temp.file');

但是你可能需要传递输入(如 sudo 密码):

$process->setInput('someSudoPassword');

但是我不知道谁是 sudo 密码。同样,我不确定哪个用户运行流程组件。

这些只是一些想法,我不确定它是否可以解决任何问题,但我希望它可以帮助您,甚至帮助您考虑另一种处理方式。

于 2016-08-04T16:13:36.707 回答
-2

你为什么想做这个?vi 是由键盘控制的东西。如果需要,您可能需要检查完整路径以及 php/symfony 是否有权访问此路径。可能您的 php 脚本无法访问此脚本,并且 Web 服务器(我假设您在这里谈论的是 Web 应用程序)可能不允许在任何地方的服务器上启动登录 shell。如果您能提供有关您的目标 + 环境的更多详细信息,那就太好了。

如果您只想编辑/操作文件,sed 命令可能是一个选项。或者直接用 php 打开/操作文件可能会更好。

于 2016-08-04T11:05:37.380 回答