2016-08-04 5 views
6

मैं निम्नलिखित कोड है:सिम्फनी प्रक्रिया से 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 

अद्यतन

लगता है यह कुछ लोगों के लिए स्पष्ट नहीं था कि मैं क्या मैं करने जा रहा हूँ। में समझा दूंगा। यह स्क्रिप्ट कंसोल में चल रही है। वही बात पासस्थु के माध्यम से काम करती है (हालांकि विम अभी भी आउटपुट के बारे में चेतावनी देता है)। मैं एक इंटरैक्टिव प्रक्रिया चाहता हूं जो उपयोगकर्ताओं को कहीं भी भेजने से पहले कुछ फाइल संशोधित करने की अनुमति देगी। मैं अपने स्वयं के संपादक को लागू नहीं करना चाहता हूं और इसलिए मैं उन्हें वीआई का उपयोग करना चाहता हूं। vi मेरे सर्वर पर उपलब्ध है (यह मेरे द्वारा प्रदत्त आउटपुट से स्पष्ट रूप से दिखाई देता है)।

+1

ठीक है, आप सुनिश्चित रूप से php के माध्यम से vi निष्पादित कर सकते हैं कर रहे हैं? (कम से कम यदि आप लिनक्स टेक्स्ट एडिटर के बारे में बात कर रहे हैं) – 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 स्क्रिप्ट के पास इस स्क्रिप्ट तक पहुंच नहीं है, और वेब सर्वर (मुझे लगता है कि आप यहां एक वेब एप्लिकेशन के बारे में बात कर रहे हैं) शायद कहीं भी सर्वर पर लॉगिन खोल शुरू करने की अनुमति नहीं दी जा सकती है। अगर आप अपने लक्ष्य + पर्यावरण के बारे में अधिक जानकारी प्रदान कर सकते हैं तो बहुत अच्छा होगा।

यदि आप फ़ाइल को संपादित/कुशल बनाना चाहते हैं, तो sed आदेश एक विकल्प हो सकता है। या सीधे php के साथ फ़ाइल को खोल/कुशल बनाना बेहतर हो सकता है।

+0

मेरा लक्ष्य एक इंटरैक्टिव कंसोल प्रक्रिया चलाने के लिए है जिसमें उपयोगकर्ता को एक फ़ाइल को संशोधित करने की संभावना दी जाएगी जिसे उसके संशोधनों के बाद कहीं भेजा जाएगा। और मेरे पास बिल्कुल एक वेब सर्वर नहीं है। PHP के पास वीआई तक पहुंच है (निश्चित रूप से, पासस्ट्रू काम करता है)। इसे लॉगिन खोल शुरू करने की अनुमति है, क्योंकि मैं इसे कंसोल से चला रहा हूं। –

+1

@DenisV आप यह जांचना चाहेंगे कि कोई 'EDITOR' पर्यावरण परिवर्तनीय सेट है या नहीं, इसके बजाय इसे सेट किया गया है। इस तरह यदि उपयोगकर्ता ने अपने डिफ़ॉल्ट क्ली संपादक को 'नैनो', 'emacs', 'vi',' vim', 'neovim', या कुछ और होने के लिए कॉन्फ़िगर किया है, तो यह काम करेगा। यदि 'EDITOR' सेट नहीं है, तो आप निश्चित रूप से मान सकते हैं कि उनके पास डिफ़ॉल्ट रूप से' vi' है। – Paulpro

+0

@Paulpro हाँ, आपकी सलाह के लिए धन्यवाद। असल में, यह अगली बात थी जो मैं करने जा रहा था, लेकिन 'vi' चलाने में सक्षम होने के बिना, इसका कोई मतलब नहीं था। आपका धन्यावाद। :) –

0

.. आपका प्रश्न माध्यम से पूरा समझ में आता है

मेरे विचार कर रहे हैं: 1 -> संपादित करने के लिए फ़ाइल नाम जिसका मतलब है निर्दिष्ट नहीं किया गया:

  • आप एक से बाहर निकलें कोड प्राप्त । हालांकि मैं गलत हो सकता था।
  • यह दिखाता है "कार्य निर्देशिका: [पथ]"। जो मुझे बताता है, शायद पथ गुम है।
  • इसके अलावा, मुझे नहीं पता कि कौन सा उपयोगकर्ता (सिस्टम पर) सिम्फनी प्रोसेस घटक चलाता है।

तो शायद कोशिश:/tmp

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

उपयोग क्योंकि किसी को भी उपयोग कर सकते है कि लिखने योग्य है संभव एक वेब फ़ोल्डर होना चाहिए, यह भी। एक और सोचा, sudo के साथ प्रक्रिया चलाने के लिए और उपयोगकर्ता vimrc निर्दिष्ट करने के लिए है:

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

लेकिन तब आप (sudo पासवर्ड) इनपुट पारित करने के लिए आवश्यकता हो सकती है:

$process->setInput('someSudoPassword'); 

लेकिन कौन है sudo पासवर्ड मैं डॉन पता नहीं दोबारा, मुझे यकीन नहीं है कि कौन सा उपयोगकर्ता प्रोसेस घटक चलाता है।

ये कुछ विचार हैं, और मुझे यकीन नहीं है कि यह कुछ हल करता है लेकिन मुझे उम्मीद है कि यह आपकी मदद कर सकता है, या यहां तक ​​कि इसे संभालने के किसी अन्य तरीके के बारे में सोचने में भी मदद करता है।

+0

आपके उत्तर के लिए धन्यवाद। पथ या फ़ाइल नाम निर्दिष्ट किए बिना 'vi' चलाया जा सकता है। '[पथ] 'यहां सिर्फ मेरी स्थानीय निर्देशिका थी जो प्रश्न के लिए अप्रासंगिक थी, इसलिए मैंने इसे छोड़ दिया। मैंने रूट के तहत भी कोशिश की, इसलिए 'सुडो' यहां मामला नहीं है। –

संबंधित मुद्दे