2011-04-27 20 views
7

मैं एक स्क्रिप्ट को एक फ़ाइल में stdin और stderr को पुनर्निर्देशित करना चाहता हूं, सामान का एक गुच्छा करें, फिर उन पुनर्निर्देशन को पूर्ववत करें और फ़ाइल सामग्री पर कार्रवाई करें। मैं कोशिश कर रहा हूं:बैश: stdin/stderr को पुनर्निर्देशित करने के लिए कैसे बाद में fd को वापस लाएं?

function redirect(){ 
    exec 3>&1 
    exec 4>&2 
    exec 1>outfile 2>&1 
} 
function undirect(){ 
    exec 1>&3 
    exec 2>&4 
} 
echo first 
redirect 
echo something 
cat kjkk 
undirect 
if some_predicate outfile; then echo ERROR; fi 

जो मुझे लगता है कि ऐसा करने लगता है, लेकिन यह अपेक्षाकृत जटिल लगता है। क्या ऐसा करने के लिए एक क्लीनर/स्पष्ट तरीका है?

उत्तर

8

यदि आपको वास्तव में इसे आगे और पीछे स्विच करने की आवश्यकता है, तो पहले से जानने के बिना कि कहां और कब जाना होगा, यह करने का काफी तरीका है। अपनी आवश्यकताओं पर निर्भर करता है, हालांकि यह तो जैसे भागों जो पुन: निर्देशित की जरूरत को अलग, और उन्हें समूह के रूप में निष्पादित करने के लिए, neater हो सकता है:

echo first 
{ 
    echo something 
    cat kjkk 
} 1>outfile 2>&1 
if some_predicate outfile; then echo ERROR; fi 
{} एक समूह आदेश में कहा जाता है

, और पूरे समूह से उत्पादन रीडायरेक्ट हो गई है । यदि आप चाहें, तो आप अपने निष्पादन को सबहेल में कर सकते हैं, क्योंकि यह केवल सबहेल को प्रभावित करता है।

echo first 
(
    exec 1>outfile 2>&1 

    echo something 
    cat kjkk 
) 
if some_predicate outfile; then echo ERROR; fi 

ध्यान दें कि मैं कोष्ठकों () उपयोग कर रहा हूँ यहाँ, बल्कि ब्रेसिज़ {} (जो पहले उदाहरण में इस्तेमाल किया गया) की तुलना में।

एचटीएच

+0

या यहां तक ​​कि वर्तमान खोल में: '{गूंज कुछ; बिल्ली afile; }> आउटफाइल 2> और 1' –

+0

@glenn; सही। पहला ऐसा हो सकता है, शायद बेहतर भी .. मैं संपादित करूंगा – falstro

3

यह मेरे लिए बहुत साफ लगता है। केवल एक चीज मैं चाहते करने के लिए, कार्य करने के लिए एक पैरामीटर के रूप "outfile" नाम पारित करने के लिए जब से तुम समारोह के बाहर फ़ाइल नाम का उपयोग है

redirect() { 
    exec 3>&1 
    exec 4>&2 
    exec 1>"$1" 2>&1 
} 
: 
redirect outfile 
: 
if some_predicate outfile; ...