2009-02-06 12 views
6

किसी की मदद कर सकते हैं निम्नलिखित व्याख्या करते हैं: अगर मैं टाइपबैश स्क्रिप्टिंग - शेल कमांड उत्पादन पुनर्निर्देशन

:

a=`ls -l` 

तो ls कमांड के उत्पादन में चर a

में सहेजा गया है लेकिन अगर मैं कोशिश:

a=`sh ./somefile` 

परिणाम खोल करने के लिए outputed है (01 परिवर्तनीय

मैं अपेक्षा करता हूं कि वेरिएबल में संग्रहीत करने के लिए 'somefile' स्क्रिप निष्पादित करने के लिए खोल का परिणाम ऑपरेशन था।

कृपया मेरी समझ के साथ क्या गलत है और ऐसा करने का एक संभावित तरीका बताएं।

धन्यवाद।

संपादित करें:

बस स्पष्ट करने के लिए, स्क्रिप्ट 'somefile' या मौजूद नहीं हो सकता है। यदि यह exsists तो मैं चाहता हूं कि स्क्रिप्ट का आउटपुट 'a' में संग्रहीत किया जाए। यदि नहीं, तो मुझे त्रुटि संदेश "a '

उत्तर

15

में संग्रहीत त्रुटि संदेश चाहिए क्योंकि मुझे लगता है कि खोल शायद स्वयं को/dev/tty से जोड़ता है लेकिन मैं गलत हो सकता हूं। आप stderr और एक करने के लिए stdout कैप्चर करना चाहते हैं, बस का उपयोग करते हैं

a=`./somefile` 

:

a=`./somefile 2>&1` 

जांच करने के लिए फ़ाइल निष्पादन योग्य है आप क्यों नहीं बस स्क्रिप्ट पर अनुमतियाँ और उपयोग पर अमल सेट नहीं होता पहली:

if [[ -x ./somefile ]] ; then 
    a=$(./somefile 2>&1) 
else 
    a="Couldn't find the darned thing." 
fi 

और आप मैं $() विधि के बजाय बैकटिक का उपयोग करने जा रहा हूँ पर ध्यान देंगे। मैं $() पसंद करता हूं क्योंकि आप उन्हें घोंसला कर सकते हैं (उदा।, "a=$(expr 1 + $(expr 2 + 3))")।

+0

इसकी अनुमतियों के बारे में नहीं है ... मैं या तो त्रुटि संदेश या वैरिएबल में संग्रहीत मूल्यों को वापस करना चाहता हूं। –

+0

मैं जो कह रहा हूं वह है कि आपको स्क्रिप्ट चलाने के लिए sh चलाने की आवश्यकता नहीं है (और यदि आप करते हैं तो sh आउटपुट पर अपनी फ़ायरवॉल लगाएगा)। बस सीधे स्क्रिप्ट चलाएं और इसके लिए, आपको इसे 'chmod + x' करने की आवश्यकता है। – paxdiablo

+0

निम्न का प्रयास करें: "chmod u + x somefile; a ='।/ somefile' "और देखें कि क्या एक सेट पर सेट हो जाता है। – paxdiablo

5

आप कमांड प्रतिस्थापन करने के नए और बेहतर तरीके से प्रयास कर सकते हैं, बैकटीक्स के बजाय $() का उपयोग करें।

a=$(sh ./somefile) 

यह अभी भी काम नहीं करता है, तो देखें कि somefile वास्तव में stderr 'ing नहीं है।

+0

मैंने कोशिश की और यह काम नहीं किया ... –

+0

शायद यह वास्तव में कुछ फ़ाइल नहीं ढूंढ सकता;) – Bogdan

2

आप सही हैं, ./somefile का stdout परिवर्तनीय a में संग्रहीत है। हालांकि, मैं stfr करने के लिए कुछ फ़ाइल आउटपुट मानते हैं। ./somefile के बाद आप 2>&1 के साथ इसे रीडायरेक्ट कर सकते हैं।

+0

ओह मुझे लगता है कि मैं देखता हूं, इसलिए 'somefile' मामले में आउटपुट कुछ भी संग्रहीत नहीं करता है, लेकिन डिफ़ॉल्ट रूप से स्क्रिप्ट द्वारा स्क्रिप्ट को पुनर्निर्देशित करता है, यही कारण है कि मैं चर पर संग्रहीत करने के विपरीत स्क्रीन पर त्रुटि संदेश देखता हूं? –

+1

नहीं * sh * के stdout को एक में संग्रहीत किया जाता है, sh .ssomefile के stdout को इसके कॉलर पर वापस नहीं भेज रहा है। – paxdiablo

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

  • कोई संबंधित समस्या नहीं^_^