एक बार में बहुत सारी कमांड पुनर्निर्देशित करने के समाधान के लिए:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
आपका मूल समाधान काम क्यों नहीं करता है: 2> और 1 निष्पादित करें मानक त्रुटि आउटपुट को आपके शेल के मानक आउटपुट पर रीडायरेक्ट करेगा, यदि आप कंसोल से अपनी स्क्रिप्ट चलाते हैं, तो आपका कंसोल होगा। कमांड पर पाइप पुनर्निर्देशन केवल कमांड के standart आउटपुट को रीडायरेक्ट करेगा।
देखने के बिंदु पर somecommand, इसका मानक आउटपुट जुड़ा हुआ पाइप में चला जाता है teeऔर मानक त्रुटि शेल के मानक त्रुटि के रूप में उसी फ़ाइल / छद्म में चली जाती है, जिसे आप शेल के मानक आउटपुट पर रीडायरेक्ट करते हैं, जो कि होगा कंसोल यदि आप कंसोल से अपना प्रोग्राम चलाते हैं।
इसे समझाने का एक सही तरीका यह है कि वास्तव में क्या होता है:
यदि आप इसे टर्मिनल से चलाते हैं तो आपके शेल का मूल वातावरण इस तरह दिख सकता है:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
मानक आउटपुट ( exec 2>&1) में मानक त्रुटि को पुनर्निर्देशित करने के बाद , आप ... मूल रूप से कुछ भी नहीं बदलते हैं। लेकिन अगर आप स्क्रिप्ट के standart आउटपुट को किसी फ़ाइल में रीडायरेक्ट करते हैं, तो आप इस तरह के माहौल को समाप्त कर देंगे:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
फिर शेल मानक त्रुटि को मानक आउटपुट में पुनर्निर्देशित करना इस तरह समाप्त होगा:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
एक कमांड चलाना इस वातावरण को विरासत में देगा। यदि आप एक कमांड चलाते हैं और इसे टी करने के लिए पाइप करते हैं, तो कमांड का वातावरण होगा:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
तो आपकी कमांड की मानक त्रुटि अभी भी वही है जो शेल अपने मानक त्रुटि के रूप में उपयोग करता है।
आप वास्तव में एक कमांड के वातावरण को देख सकते हैं /proc/[pid]/fd: ls -lप्रतीकात्मक लिंक की सामग्री को सूचीबद्ध करने के लिए उपयोग करें। यहां 0फ़ाइल मानक इनपुट है, 1मानक आउटपुट है और 2मानक त्रुटि है। यदि कमांड अधिक फाइलें खोलता है (और अधिकांश प्रोग्राम करते हैं), तो आप उन्हें भी देखेंगे। एक प्रोग्राम अपने मानक इनपुट / आउटपुट को पुनः निर्देशित या बंद करने का विकल्प चुन सकता है 0, 1और 2।
|&एक शॉर्टकट के रूप में काम करता है2>&1 |, यह कम से कम थोड़ा अधिक सुविधाजनक है।