【问题标题】:How to run vi from Symfony Process?如何从 Symfony 进程运行 vi?
【发布时间】:2016-12-10 10:06:13
【问题描述】:

我有以下代码:

$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 在我的服务器上可用(从我提供的输出中可以清楚地看到)。

【问题讨论】:

  • 嗯,你确定可以通过php执行vi吗? (至少如果你在谈论 linux 文本编辑器)
  • 我确定。可以使用 passthru() 来执行它。我的目标是运行一个交互式过程,在这个过程中,用户可以修改一个文件,该文件将在修改后发送到某个地方。

标签: php symfony symfony-process


【解决方案1】:

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

【讨论】:

  • 也许比echo更好的替代品:fwrite($type === Process::OUT ? STDOUT : STDERR, $buffer);
【解决方案2】:

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

我的想法是:

  • 你得到一个退出代码: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 密码。同样,我不确定哪个用户运行流程组件。

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

【讨论】:

  • 感谢您的回复。 vi 可以在不指定路径或文件名的情况下运行。 [path] 这里只是我的本地目录,与问题无关,所以我跳过它。我也在root下试过了,所以sudo不是这里的情况。
【解决方案3】:

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

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

【讨论】:

  • 我的目标是运行一个交互式控制台进程,在该进程中,用户可以修改一个文件,该文件将在修改后发送到某个地方。而且我根本没有网络服务器。 PHP 可以访问 vi(当然,因为 passthru 有效)。允许启动登录 shell,因为我是从控制台运行的。
  • @DenisV 您可能想检查是否设置了EDITOR 环境变量,如果设置了则使用它。这样,如果用户将其默认 cli 编辑器配置为 nanoemacsvivimneovim 或其他内容,它将起作用。如果EDITOR 没有设置,你当然可以假设他们默认有vi
  • @Paulpro 是的,谢谢您的建议。事实上,这是我接下来要做的事情,但由于无法运行 vi,这是没有意义的。无论如何,谢谢你。 :)
猜你喜欢
  • 2019-07-01
  • 1970-01-01
  • 2014-10-19
  • 2020-03-19
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多