如何从 Symfony Process 运行 vi?

How to run vi from Symfony Process?

我有以下代码:

        $process = new Process('vi');

        try {
            $process->setPty(true);
            $process->mustRun(function ($type, $buffer) {
                echo $buffer;
            });
            //echo $process->getOutput();
        } catch (ProcessFailedException $e) {
            echo $e->getMessage();
        }

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

The command "vi" failed.

Exit Code: 1(General error)

Working directory: [path]

Output:
================
Vim: Error reading input, exiting...
Vim: Finished.


Error Output:
================
Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal

更新

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

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

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

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

我的想法是:

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

也许可以试试:

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

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

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

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

$process->setInput('someSudoPassword');

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

这些只是一些想法,我不确定它是否能解决任何问题,但我希望它能对你有所帮助,甚至有助于思考另一种处理方法。

在这里我得到了正确的答案: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();
    }