2010-11-04 11 views
11

में फ़ाइल डिस्क्रिप्टर या फ़ाइल नाम के साथ बैश रीडायरेक्शन मेरी स्क्रिप्ट में मैं कुछ फाइलों को लिखने या कुछ शर्तों के आधार पर stdout लिखने में सक्षम होना चाहता हूं। मैं क्यों इस मेरी स्क्रिप्ट में काम नहीं करता है के रूप में उत्सुक हूँ:परिवर्तनीय

out=\&1 
echo "bird" 1>$out 

मैं उद्धरण के विभिन्न संयोजन की कोशिश की है, लेकिन मैं एक "& 1" के बजाय यह stdout के लिए लिखने की बनाई गई फ़ाइल होने रहते हैं। यह काम करने के लिए मैं क्या कर सकता हूं मैं कैसे चाहता हूं?

+0

क्या आपका सिस्टम समर्थन करता है =/dev/stdout? – mob

उत्तर

1

मुझे यकीन है कि इसे आदेश के साथ करना है जिसमें bash कमांड लाइन को संसाधित करता है। निम्नलिखित काम करता है:

export out=\&1 
eval "echo bird 1>${out}" 

क्योंकि चर प्रतिस्थापन मूल्यांकन से पहले होता है।

0

eval के साथ प्रयास करें। यह अपने आप $out का मूल्य की व्याख्या से काम करना चाहिए:

out='&1' 
eval "echo \"bird\" 1>$out" 

मानक आउटपुट पर bird प्रिंट होगा (और एक फाइल करने के लिए यदि आप out बदल)।

ध्यान दें कि आपको eval string के अंदर क्या हो रहा है इसके बारे में सावधान रहना होगा। आंतरिक उद्धरणों के साथ बैकस्लैश नोट करें, और eval प्रदर्शन से पहले परिवर्तनीय $out संदिग्ध (डबल कोट्स के माध्यम से) संदिग्ध है।

5

एक संभवतः सुरक्षित विकल्प eval को (इस उदाहरण में फ़ाइल वर्णनकर्ता 3) exec का उपयोग कर एक अस्थायी फ़ाइल वर्णनकर्ता में अपने गंतव्य dup के लिए है:

if somecondition; then exec 3> destfile; else exec 3>&1; fi 

echo bird >&3 
+0

+1, 'eval' से बचने के लिए सबसे अच्छा है। –

+3

@ डेनिस: मैं वास्तव में समझ नहीं पा रहा हूं कि eval cliché ... stackoverflow में सभी बैश से संबंधित प्रश्न भरने लगता है :) फिर और हजारवां समय: 'eval' एक उपकरण है और खुद ही जोखिम नहीं है .. यह कहने जैसा है कि आपको लिस्प से बचना है क्योंकि आप लिस्प डेटा को कोड के रूप में देख सकते हैं ... –

+1

@Diego: 'eval' एक उपयोगी टूल हो सकता है। यह गंभीर संभावित सुरक्षा जोखिम भी प्रस्तुत करता है। यदि आप इससे बचते हैं, तो आपको जोखिम के उस विशेष सेट के बारे में चिंता करने की ज़रूरत नहीं है। इससे बचने में अक्सर आसान होता है। जब भी संभव हो आसान और सुरक्षित मार्ग ले लो। जब आप 'eval' का उपयोग करते हैं तो सुनिश्चित करें कि आपको वास्तव में इसकी आवश्यकता है और आप इनपुट को सही ढंग से स्वच्छ करते हैं और समस्याओं को रोकने के लिए अन्य आवश्यक कदम उठाते हैं। [BashFAQ/048] देखें (http://mywiki.wooledge.org/BashFAQ/048) और [यह उत्कृष्ट SO प्रश्न] (http://stackoverflow.com/q/2571401) (के लिए और इसके विरुद्ध)। साथ ही, ध्यान दें कि मैंने कहा "बचने के लिए सबसे अच्छा" नहीं "कभी भी उपयोग न करें"। –

2

डिएगो के जवाब पर व्याख्या। जहां stdout सशर्त चला जाता है

if [ someCondition ] ; then 
    # all output now goes to $file 
    exec 1>$file 
fi 

echo "bird" 

या अपनी फ़ाइल वर्णनकर्ता बनाने को बदलने के लिए;

if [ someCondition ] ; then 
    # 3 points to stdout 
    exec 3>&1 
else 
    # 3 points to a file 
    exec 3>$outfile 
fi 

echo "bird" >&3 

से अनुकूलित: csh programming considered harmful - कुछ और पुनर्निर्देशन चाल के लिए इसे बाहर की जाँच करें। या बैश मैन पेज पढ़ें।

+0

मुझे अपनी खुद की लिपि में काम करने में परेशानी हो रही थी, मैं किसी कारण से पूर्ण परिवर्तनीय विस्तार नोटेशन का उपयोग करने के लिए घायल हो गया, पूर्व:' destfile = "/ some/path"; निष्पादन 3> $ {destfile} ' – Eliot

2

2015 तक, >&${out} पर रीडायरेक्ट करना संभव है। उदा।,

exec {out}>&1 
echo "bird" 1>&${out}