如何从Symfony Process运行vi?

时间:2016-08-04 10:21:15

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

3 个答案:

答案 0 :(得分:4)

我给了一个正确答案:http://webix.com/snippet/c01714d0

基本上,我必须使用$process->setTty(true)。所以,完整的例子将是:

    $process = new Process('vi');

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

答案 1 :(得分:0)

顺便提一句,你的问题很有道理。

我的想法是:

  • 您会收到退出代码:1 - >这意味着要编辑的文件名不是 指定。虽然我错了。
  • 显示"工作目录: [路径]&#34 ;.这告诉我,也许路径不见了。
  • 另外,我不知道哪个用户(在系统上)运行Symfony Process Component。

所以也许试试:

const branchSchema = mongoose.Schema({ name: String });
const Company = mongoose.model('Company', mongoose.Schema({
  name: String,
  branches: [{type: mongoose.Schema.ObjectId, ref: 'Branch'}]
}));

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

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

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

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

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

这些只是一些想法,我不确定它是否会解决任何问题,但我希望它可以帮助你,甚至帮助思考另一种方法来解决这个问题。

答案 2 :(得分:-2)

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

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