2016-08-04 115 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'不是這裏的情況。 –