2012-02-05 22 views
8

विम में, शेल कमांड के आउटपुट को पढ़ने के लिए सबसे अच्छा (पोर्टेबल और तेज़) तरीका क्या है? यह आउटपुट बाइनरी हो सकता है और इस प्रकार नल होते हैं और (नहीं) पीछे की नई रेखा होती है जो मायने रखती है। वर्तमान समाधान मैं देखता हूं:खोल कमांड के आउटपुट को पढ़ने का सबसे अच्छा तरीका

  1. system() का उपयोग करें। समस्याएं: एनयूएलएल के साथ काम नहीं करती है।
  2. :read ! का उपयोग करें। समस्याएं: पीछे की नई लाइन को सहेज नहीं पाएगी, स्मार्ट डिटेक्टिंग आउटपुट प्रारूप (डॉस/यूनिक्स/मैक) होने का प्रयास करती है।
  3. अस्थायी फ़ाइल के पुनर्निर्देशन के साथ ! का उपयोग करें, फिर इसे पढ़ने के लिए readfile(, "b") का उपयोग करें। समस्याएं: एफएस के लिए दो कॉल, shellredir विकल्प डिफ़ॉल्ट रूप से stderr को भी रीडायरेक्ट करता है और यह कम पोर्टेबल होना चाहिए ('shellredir' यहां उल्लेख किया गया है क्योंकि यह वैध मान पर सेट होने की संभावना है)।
  4. system() का उपयोग करें और xxd के माध्यम से आउटपुट फ़िल्टर करें। समस्याएं: बहुत धीमी, कम से कम पोर्टेबल (पाइप के लिए 'shellredir' के बराबर नहीं)।

कोई अन्य विचार?

उत्तर

4

आप टेक्स्ट संपादक का उपयोग कर रहे हैं। यदि आप एनयूएल की देखभाल करते हैं, ईओएल और (संभवतः) विरोधाभासी एन्कोडिंग का पीछा करते हैं, तो आपको किसी हेक्स संपादक का उपयोग करने की ज़रूरत है?

मैं अपने कार्यों का नियंत्रण की इस राशि की जरूरत है, मैं वास्तव में XXD मार्ग का उपयोग,

:se binary 

एक अच्छा विकल्प के साथ तुम्हें याद करने लगते हैं डालने मोड अभिव्यक्ति रजिस्टर है प्रविष्टि:

सीआर=system('ls -l')दर्ज

यह चरित्र एन्कोडिंग व्यवसाय के बारे में समझदार/कम घुसपैठ नहीं हो सकता है, लेकिन यदि आप अपने लिए महत्वपूर्ण हैं तो आप इसे आजमा सकते हैं।

या आप पर्ल या पायथन समर्थन इस्तेमाल कर सकते हैं प्रभावी ढंग से popen

असहज विचार का उपयोग करें:

:perl open(F, "ls /tmp/ |"); my @lines = (<F>); $curbuf->Append(0, @lines) 
+0

आप ' = प्रणाली ('printf' '\ x00' '') ' कोशिश कर सकते हैं। यह कुछ भी आउटपुट नहीं करेगा, जबकि ':%! Printf '\ x00'' बफर में'^@ 'के रूप में एकल NULL को रखा जाएगा (बड़ी समस्या:':%! Printf' \ x00 \ r \ n'' करता है वही)। – ZyX

+0

समस्या यह है कि मैं दो कार्य नहीं करना चाहता: "बफर में कमांड पढ़ें", आमतौर पर "%!" और "फ़ाइल में कमांड आउटपुट डालें" द्वारा प्राप्त किया जा सकता है और मैं नहीं कह सकता कि मुझे कभी और आवश्यकता नहीं होगी। इस मामले में 'readfile() 'के लिए एनालॉग सबसे लचीला समाधान है। – ZyX

+0

बस पर्ल/पायथन समर्थन का उपयोग करने के बारे में सोचा; स्टार्टर के लिए जवाब देखें – sehe