2012-12-28 14 views
5

मुझे अक्सर कुछ भाषा संरचनाओं को समझने में परेशानी होती है क्योंकि वे गुगल या डकडॉगिंग करते समय पंजीकरण नहीं करेंगे। थोड़ा प्रयोग करने के साथ, इसे समझना अक्सर आसान होता है, लेकिन मुझे यह नहीं मिलता है।"exec 3> & -" में शून्य का अर्थ क्या है और मैं इसका उपयोग कैसे करूं?

मैं अक्सर 2>&1 या 3>&- जैसी सामग्री को बैश स्क्रिप्ट में देखता हूं। मुझे पता है कि यह किसी तरह का पुनर्निर्देशन है। 1 stdout है और 2 stderror है। 3 शायद कस्टम है। लेकिन ऋण क्या है?

इसके अलावा, मेरे पास एक स्क्रिप्ट है जिसका आउटपुट मैं लॉग करना चाहता हूं, लेकिन स्क्रीन पर भी देखना चाहता हूं। मैं इसके लिए exec > >(tee $LOGFILE); exec 2>&1 का उपयोग करता हूं। यह काम करता हैं। लेकिन कभी-कभी जब मैं इस स्क्रिप्ट को झुकाता हूं, तो मैं अब प्रॉम्प्ट पर टाइप नहीं कर सकता। आउटपुट Ctrl+C के बाद छिपा हुआ है। क्या मैं इसे ठीक करने के लिए कस्टम चैनल और माइनस साइन का उपयोग कर सकता हूं, या यह असंबंधित है?

+1

आपके पास दो सटीक उत्तर हैं। दस्तावेज़ [सीएसएच प्रोग्रामिंग कंसिड हर्मफुल] (http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/) इन नोटेशन के उपयोग को भी शामिल करता है और बताता है कि समुद्र के गोले क्यों छोड़े जाना चाहिए समुद्री किनारे और स्क्रिप्ट लिखने के लिए उपयोग नहीं किया जाता है। –

उत्तर

5
  1. 2>&1 मतलब यह है कि stderr stdout को
  2. 3>&- मतलब यह है कि फ़ाइल वर्णनकर्ता 3, लेखन (stdout के रूप में ही) के लिए खोल दिया, बंद कर दिया है पुनः निर्देशित किया गया है।

आप पुनर्निर्देशन here के अधिक उदाहरण

देख सकते हैं
  1. सवाल नंबर 3 के रूप में, मुझे लगता है कि this एक अच्छा कड़ी है।
4

3>&- फ़ाइल वर्णनकर्ता संख्या 3 (यह शायद 3>filename साथ पहले खोल दिया गया है) को बंद करें।

2>&1 फ़ाइल डिस्क्रिप्टर 2 (stderr) के आउटपुट को फ़ाइल डिस्क्रिप्टर 1 (stdout) के समान गंतव्य पर रीडायरेक्ट करता है। यह dup2() syscall पर कॉल करता है।

फ़ाइल डिस्क्रिप्टर को पुनर्निर्देशित करने के बारे में अधिक जानकारी के लिए कृपया बैश मैनपेज ('मैन बैश) से परामर्श लें। वे घने लेकिन महान हैं।

अपनी स्क्रिप्ट के लिए, मैं ऐसा करना होगा:

#!/bin/bash 
if [[ -z $recursive_call ]]; then 
    recursive_call=1 
    export recursive_call 
    "$0" "[email protected]" | tee filename 
    exit 
fi 
# rest of the script goes there 

यह स्क्रिप्ट से बाहर निकलें कोड खो हालांकि। मुझे लगता है कि इसे पाने के लिए बैश में एक तरीका है लेकिन मुझे अब याद नहीं है।

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