2009-04-06 14 views
6

मान लीजिए आप एक पर्ल स्क्रिप्ट "foobar.pl" कि stdout कोएक स्टैंडअलोन बैश आदेश

date -R 

निम्नलिखित प्रिंट है के रूप में किसी स्क्रिप्ट का आउटपुट चलाने के लिए और आप एक के रूप में जो कुछ भी है कि पर्ल स्क्रिप्ट आउटपुट चलाना चाहते हैं स्टैंडअलोन बैश कमांड (सुरक्षा समस्याओं के बारे में चिंता न करें क्योंकि यह एक विश्वसनीय वातावरण में चल रहा है)।

आप इसे एक स्टैंडअलोन कमांड के रूप में पहचानने के लिए कैसे बाश प्राप्त करते हैं?

मैंने xargs का उपयोग करने का प्रयास किया है, लेकिन ऐसा लगता है कि तर्क केवल को पूर्व परिभाषित कमांड में पास करना चाहते हैं।

मैं चाहता हूं कि पर्ल स्क्रिप्ट किसी भी मनमाने ढंग से कमांड को आउटपुट करने में सक्षम हो।

$command = 'date -R' 
system($command); ## in the perl script 

क्योंकि मैं इसे एक मौजूदा cygwin वातावरण में चलाना चाहते हैं से काम नहीं होता ...

foobar.pl | xargs bash -i {} 

ऊपर क्योंकि पार्टी एक नई प्रक्रिया है और इस तरह से चल रहा है किया जा रहा है काम नहीं करता है bash_profile से प्रारंभिकरण और सेटिंग्स तत्काल नहीं मिलती हैं।

उत्तर

4

बुरा:

`perl foo.pl` 
$(perl foo.pl) 

ऐसा क्यों बुरा है? इतने सारे कारणों से; सबसे विशेष रूप से:

  • Wordsplitting: क्या तुम यहाँ क्या कर रहे हैं पहली हिस्सा करने के लिए तर्क के रूप में, पर्ल स्क्रिप्ट का आउटपुट लेने हिस्सा जहाँ भी रिक्त स्थान, टैब या नई-पंक्तियों देखते हैं में विभाजित है, और ले जा रहा है उन हिस्सा जो चलाने के लिए आदेश है। $(echo 'date +%s') जैसे वास्तव में बेहद सरल मामलों में यह काम कर सकता है; लेकिन यह वास्तव में आप वास्तव में क्या कर रहे हैं का एक बहुत बुरा प्रतिनिधित्व है।
  • आप उद्धरण या अन्य bash पैरामीटर विस्तार, बैश कीवर्ड इत्यादि जैसी शैल सुविधाओं का उपयोग नहीं कर सकते हैं।

अच्छा है, लेकिन असुविधाजनक:

perl foo.pl > mytmpfile; bash mytmpfile 

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

अस्थायी फ़ाइल निष्पादित करने के लिए . या source का उपयोग न करें, जब तक कि आप वास्तव में सक्रिय खोल में इसे चलाने का इरादा नहीं रखते हैं। इसके अलावा, जब आप . या source का उपयोग करते हैं, तो आप बाद में अपनी अस्थायी फ़ाइल को विश्वसनीय रूप से साफ़ करने में सक्षम नहीं होंगे।

शायद सबसे अच्छा समाधान:

perl foo.pl | bash 

यह सुंदर सुरक्षित चौतरफा माना आपके पर्ल स्क्रिप्ट आउटपुट सही bash वाक्य रचना, निश्चित रूप से (, कम से कम बग की आशंका वाले के संदर्भ में "सुरक्षित") है ।

वैकल्पिक काफी एक ही बात है कि:

bash < <(perl foo.pl) 
bash <(perl foo.pl) 
+0

bash <($ OUTPUT) वह है जिसे मैं ढूंढ रहा था। यह पाइपिंग के साथ एक बड़ा अंतर बनाता है क्योंकि आपके पास अभी भी इसका नियंत्रण है - इनपुट के लिए। – yclian

3

प्रयास करें:

foobar.pl | bash 
+0

निर्यात foo = 'foobar.pl सादगी के लिए 'FOO – ojblass

0

मैं यह नहीं लगता कि वास्तव में आप क्या खोज रहे है, लेकिन इसके क्या मैं :-) मिल गया है

perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script 

गुड लक!

4

पर्ल फ़ाइल को देखते हुए:

print "date"; 

निम्नलिखित बैश आदेश यह करना होगा।

> $(perl qq.pl) 
Mon Apr 6 11:02:07 WAST 2009 

लेकिन यह एक अलग खोल में चलाया जाता है। क्या तुम सच में वर्तमान खोल के संदर्भ में यह आह्वान करने के लिए चाहते हैं, तो ऐसा करते हैं:

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$ 
Mon Apr 6 11:04:59 WAST 2009 
+0

$() मामले में, "perl qq.pl" आदेश एक अलग खोल में चलाया जाता है, लेकिन इसके द्वारा लौटाया गया आदेश, "दिनांक", वर्तमान खोल में चलाया जाता है, जो मुझे लगता है, क्या वह चाहता था। –

+0

आदेशों को चलाने के लिए आपको '.' या' स्रोत' का उपयोग नहीं करना चाहिए। आप कभी नहीं जानते कि स्क्रिप्ट आपके चलने वाले खोल में क्या करेगी; जिसका अर्थ है कि आप इस तथ्य पर भरोसा नहीं कर सकते कि आपको अपने अस्थायी फ़ाइल क्लीनअप को सही तरीके से करने का मौका भी मिलेगा। EXIT पर एक जाल में सफाई को रखकर उसमें मदद मिल सकती है। – lhunath

+0

@ लुननाथ, क्या आपने सवाल नहीं पढ़ा? रेवेन "सुरक्षा समस्याओं के बारे में चिंता न करें क्योंकि यह एक विश्वसनीय वातावरण में चल रहा है"। मैंने इसका मतलब यह लिया कि पर्ल स्क्रिप्ट के आउटपुट को नियंत्रित किया गया था। और "।" का उपयोग विशेष रूप से आवश्यकता को पूरा करने के लिए यह एक नई प्रक्रिया शुरू नहीं किया गया था। – paxdiablo

0

खुला के साथ प्रयास करें ($ एफ एच "- |", $ ARG1, $ ARG2)

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