logfile को निष्पादित और टी: इन बैश कमांड को समझाएं


15

मैंने इसे अपनी बैश स्क्रिप्ट फ़ाइल के शीर्ष पर देखा:

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

यह क्या करता है? दो निष्पादन प्रक्रियाएं यहां क्या कर रही हैं? मुझे एहसास है कि इसे इस तरह से रखते हुए, स्क्रिप्ट के निष्पादन के सभी आउटपुट को पाइप किया जाता है, $LOGFILEलेकिन मैं execबयानों के परिप्रेक्ष्य से समझना चाहता था ।


यह स्पष्ट कर सकता है: linuxjournal.com/content/bash-redirections-use-exec
coffeMug

1
आपने अपनी बैश स्क्रिप्ट फ़ाइल के शीर्ष पर इसे देखा ? ;)
सेबब

1
दो execलाइनें पूरी तरह से अच्छी तरह से सिर्फ एक हो सकती हैं ( exec > >(tee "$LOGFILE") 2>&1)।
जोनाथन लेफ़लर

जवाबों:


18

गोले में, exec1) फ़ाइल खोलने और पुनर्निर्देशन 2) वास्तविक execआईएनजी (वर्तमान प्रक्रिया छवि को दूसरी प्रक्रिया छवि के साथ बदलना) करता है।

ये execs पुनर्निर्देशन हैं।

सबसे पहले आप अनुप्रेषित ( exec 1> >(tee $LOGFILE)) stdoutएक प्रक्रिया प्रतिस्थापन-उत्पन्न एक एक समय पर से जुड़े पाइप के वर्णनकर्ता (1) teeप्रक्रिया है कि $LOGFILEइसके पहले तर्क के रूप में और फिर आप अनुप्रेषित stderrजहां वर्णनकर्ता के रूप में एक ही जगह पर वर्णनकर्ता (2) 1अब अंक (टी पाइप)।

यह ध्यान में रखते हुए कि दायरकर्ता को विरासत में मिला है, आपने भविष्य stdoutऔर stderrउत्पादन को पूरी तरह से बना दिया teeहै, जो इसे लिखता है $LOGFILEऔर जहां भी दायर की जाती है 1 मूल रूप से (शायद आपके टर्मिनल) को इंगित करता है।


नोट: टी प्रक्रिया मूल स्टडआउट (= मूल फाइलस्क्रिप्ट 1) के लिए आउटपुट करती है क्योंकि, जैसा कि आप साधारण कमांड विस्तार और प्रक्रिया प्रतिस्थापन के लिए बैश (1) से सीख सकते हैं , प्रक्रिया प्रतिस्थापन ( अन्य विस्तार के साथ) पहले होता है। पुनर्निर्देशन निष्पादित हो जाता है, जिसका अर्थ है कि पुनर्निर्देशन शुरू होने के बाद होता है, एक ही फाइलस्क्रिप्ट 1 के साथ छोड़ देता है जो इसे मूल शेल से विरासत में मिला है। (यदि यह चारों ओर का दूसरा तरीका था, तो इसे अपने स्वयं के इनपुट को लिखने के लिए बनाया जाएगा, जो इसके गतिरोध के आधार पर इसे गतिरोध बना सकता है)।>() <()exec 1> >(tee "$LOGFILE") teeteetee

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.