"निष्पादन और फ़ाइल नाम" जारी करने के बाद टर्मिनल में आउटपुट को पुनर्स्थापित करना


15

मैं निम्नलिखित को निष्पादित करने की कोशिश कर रहा हूं:

exec &>filename

इसके बाद मैं कुछ भी नहीं देख पा रहा हूं, जिसमें मैंने टाइप किया है, ठीक है।

मैं भयावह रूप से कोशिश करता हूं, exec 1>&1और exec 2>&2, लेकिन कुछ भी नहीं होता है।

अब, शेल को मारे बिना, मैं स्टडआउट पर पुनर्निर्देशित किए गए आउटपुट को कैसे वापस लाऊंगा और त्रुटि को क्रमशः स्टडर पर पुनर्निर्देशित किया जाएगा? क्या फ़ाइल डिस्क्रिप्टर मानक [इन | आउट] पुट और स्टेडर को संदर्भित करने का एकमात्र तरीका है?


1
हम्म ... आप अपने इंटरएक्टिव शेल के स्टडर / स्टडआउट को पुनर्निर्देशित क्यों करते हैं? यह execनिर्माण आम तौर पर स्क्रिप्ट में उपयोग किया जाता है जो एक फ़ाइल में उदाहरण के लिए, अपने आउटपुट को पुनर्निर्देशित करने के लिए चलते हैं। मैं एक इंटरैक्टिव सत्र में इसके लिए एक उपयोग नहीं देखता।
मार्टिन वॉन विटिच

3
@MartinvonWittich मैं निष्पादन पर बयान से सहमत हूं। मैं सहमत हूँ। मैं सिर्फ एक बच्चा हूं जो चारों ओर खेल रहा है :)
user917279

जवाबों:


23

आपके द्वारा चलाने के बाद exec &>filename, शेल का मानक आउटपुट और मानक त्रुटि चली जाती है filename। मानक इनपुट परिभाषा के अनुसार फ़ाइल डिस्क्रिप्टर 0 है, और मानक आउटपुट fd 1 है और मानक त्रुटि fd 2 है।

एक फ़ाइल विवरणक या तो पुनर्निर्देशित या गैर-पुनर्निर्देशित नहीं है: यह हमेशा कहीं न कहीं जाता है (यह मानते हुए कि प्रक्रिया में यह वर्णनकर्ता खुला है)। किसी फ़ाइल डिस्क्रिप्टर को पुनर्निर्देशित करने का अर्थ है कि वह जहां जाता है उसे बदलना। जब आप दौड़ते थे exec &>filename, तो stdout और stderr पूर्व में टर्मिनल से जुड़े होते थे, और कनेक्ट हो जाते थे filename

हमेशा वर्तमान टर्मिनल को संदर्भित करने का एक तरीका है /dev/tty:। जब कोई प्रक्रिया इस फ़ाइल को खोलती है, तो इसका अर्थ है प्रक्रिया का नियंत्रण टर्मिनल , जो भी हो। इसलिए यदि आप उस शेल के मूल स्टडआउट और स्टैडर को वापस प्राप्त करना चाहते हैं, तो आप ऐसा कर सकते हैं क्योंकि वे जिस फ़ाइल से जुड़े थे वह अभी भी आसपास है।

exec &>/dev/tty

1
जैसा कि @ जोसेफ आर। ने उत्तर दिया $ (tty) मुझे / dev / pty0 दिखाता है, लेकिन आपका कमांड भी काम करता है, जो यूनिक्स फ्लेवर में अधिक पोर्टेबल है? अधिक स्पष्ट उत्तर के लिए यो यू धन्यवाद।
user917279

2
@ user917279 वे विभिन्न यूनिक्स फ्लेवर्स पर काम करने के अर्थ में समान रूप से पोर्टेबल हैं। /dev/ttyऐसे मामलों में काम करता है जहां $(tty): /dev/ttyकाम नहीं करता जब तक कि प्रक्रिया में एक नियंत्रण टर्मिनल होता है (जो कि आप सबसे अच्छी उम्मीद कर सकते हैं, क्योंकि अभी भी कुछ प्रक्रिया को टर्मिनल के साथ जोड़ना है), जबकि $(tty)आवश्यकता है कि टर्मिनल अभी भी खोला जाए मानक इनपुट पर।
गिल्स एसओ- बुराई को रोकना '

क्यों exec &>/dev/ttyऔर क्या नहीं exec >/dev/tty?
एंथोनी रटलेज

@AnthonyRutledge क्योंकि सवाल यह है कि क्या करना है exec &>filename, उसके बाद क्या नहीं करना है exec >filename
गिल्स एसओ- बुराई को रोकना '

11

तुम्हें चाहिए

exec &>$(tty)

आप अपने प्रश्न में क्या कर रहे हैं stdout में पुनरावृत्ति कर रहा है और मूल stdout और stderr को पहले से ही फ़ाइल में रीडायरेक्ट कर दिया गया है।

जैसा कि गिल्स का उत्तर बताता है, ttyवर्तमान टर्मिनल के टर्मिनल डिवाइस को वापस कर देगा। यह वह जगह है जहां तीन मानक फ़ाइल डिस्क्रिप्टर लॉगिन शेल में डिफ़ॉल्ट रूप से / से आ रहे हैं। इसलिए उपर्युक्त कथन ttyटर्मिनल डिवाइस पर रीडायरेक्ट स्टडआउट और स्टेडर को वापस उपयोग करता है जैसा कि वे पहले थे।

यदि आप पोर्टेबिलिटी के बारे में चिंतित हैं (गिल्स के उत्तर पर आपकी टिप्पणी के अनुसार), दोनों विधियाँ ( ट्टी यूटिलिटी और /dev/ttyफ़ाइल ) पोसिक्स मानक में हैं।

गिल्स की टिप्पणी से कॉपी किए गए शब्दशः:

There's an advantage to /dev/tty: it works even after exec <somefile, 
whereas $(tty) would complain “not a tty”

यह काम करता हैं! धन्यवाद। echo $ (tty) देता है / dev / pty0 (cygwin में), यह स्टड, स्टडआउट से कैसे संबंधित है और उपरोक्त कथन के साथ क्या होता है? कृपया मुझे बताएं कि क्या मुझे इसे अलग प्रश्न के रूप में पूछने की आवश्यकता है।
user917279

@ user917279 उत्तर अपडेट किया गया।
जोसेफ आर।

धन्यवाद यूसुफ। जाइल्स के उत्तर को देखने से पहले मैंने यह प्रश्न पोस्ट किया। आपका बहुत बहुत धन्यवाद। कृपया मुझे गिल्स के उत्तर को स्वीकार करने की अनुमति दें, क्योंकि इससे मेरे जैसे मूक दिमाग को भी ठीक से समझ में आ सके।
user917279

2
/dev/ttyइसका एक फ़ायदा है : इसके बाद भी काम करता है exec <somefile, जबकि $(tty)शिकायत होगी "न कि एक ट्टी"।
गिल्स एसओ- बुराई को रोकना '

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