2016-08-04 116 views
6

我有以下代码:如何从Symfony进程运行vi?

 
     $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 

UPDATE

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

+1

那么,你确定你可以通过php执行vi吗? (至少如果你在谈论linux文本编辑器) – Epodax

+0

我确定。可以使用passthru()来执行它。我的目标是运行一个交互式的过程,在这个过程中,用户可以修改一个文件,并在修改后发送到某个地方。 –

回答

4

在这里,我被赋予了正确答案: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(); 
    } 
-2

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

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

+0

我的目标是运行一个交互式控制台进程,在这个进程中,用户将有可能修改将在其修改后发送到某处的文件。而且我根本没有网络服务器。 PHP有权访问vi(当然,作为passthru works)。允许启动登录shell,因为我正在从控制台运行它。 –

+1

@DenisV你可能想检查是否有一个'EDITOR'环境变量集,并用它来代替它,如果它被设置。这样,如果用户将其默认的cli编辑器配置为'nano','emacs','vi','vim','neovim'或其他东西,它就可以工作。如果'EDITOR'没有设置,你当然可以认为他们有'vi'作为默认值。 – Paulpro

+0

@Paulpro是的,谢谢你的建议。事实上,这是我接下来要做的事情,但是如果不能运行'vi',这是没有意义的。无论如何,谢谢。 :) –

0

你的问题让的方式完整意义上的..

我的想法是:

  • 你得到一个退出码: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的密码我不不知道。再次,我不确定哪个用户运行过程组件。

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

+0

感谢您的回复。可以在不指定路径或文件名的情况下运行“vi”。 '[path]'这里只是我的本地目录,与问题无关,所以我跳过了它。我也在根目录下试过,所以'sudo'不是这里的情况。 –