टी stdout stderr करने के लिए?


17

मैं एक प्रक्रिया से दूसरी प्रक्रिया के स्टडआउट को भेजना चाहूंगा, लेकिन कंसोल को भी। उदाहरण के लिए stdout को stdout + stderr पर भेजना।

उदाहरण के लिए, मुझे git editनिम्नलिखित के लिए उपनाम मिला है :

git status --short | cut -b4- | xargs gvim --remote

मैं फ़ाइलनाम की सूची स्क्रीन पर भी भेजना चाहूंगा xargs

तो, वहाँ एक समान teeउपयोगिता है कि यह करूँगा? ताकि मैं कुछ ऐसा कर सकूं:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

जवाबों:


14

tee वर्तमान कंसोल का उपयोग करके डुप्लिकेट कर सकते हैं tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

यदि आपकी कमांड एक स्क्रिप्ट के भीतर है , तो आप उपयोग कर सकते हैं /dev/stdoutया /dev/stderrउन्हें पुनर्निर्देशित किया जा सकता है। ध्यान दें कि /dev/ttyहमेशा कंसोल होगा (और एक गैर-इंटरैक्टिव शेल में मौजूद नहीं हो सकता है)। यह गलत है, टिप्पणियों को पढ़ें।


1
दरअसल, आपके द्वारा दिखाए गए पाइपलाइन /dev/stdout में पुनर्निर्देशित किया गया है। यही है, यदि आप tee /dev/stdoutप्रभाव का उपयोग कर रहे थे तो यह होगा कि सब कुछ xargsदो बार भेजा जाता है, और टर्मिनल पर कुछ भी नहीं जाता है।
celtschk

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

अगर तुम मुझे विश्वास नहीं है, अपने खोल और प्रकार शुरू echo foo | tee /dev/stdout | tr f bऔर echo foo | tee /dev/tty | tr f b। यहाँ आपके लिए एक संकेत है: यह वह है teeजो /dev/stdoutफ़ाइल नाम के रूप में व्याख्या करता है ।
celtschk

2
आप सही हैं, मुझे नहीं पता कि मैं कैसे चूक गया। मैंने ट्टी और स्टडआउट के साथ अपने स्वयं के शेल में कुछ परीक्षण किए और मैं किसी भी तरह से चूक गया। स्पष्टीकरण के लिए धन्यवाद, मैंने गलत बयान को हटा दिया।
विंसेंट रॉबर्ट

ठीक है, यह देखते हुए कि स्टेडर पाइप से प्रभावित नहीं है, आपको इसे हटाने की आवश्यकता नहीं होगी (बेशक स्क्रिप्ट पुनर्निर्देशन चेतावनी बनी हुई है, लेकिन स्क्रिप्ट के लिए, पुनर्निर्देशन आमतौर पर एक वांछित संपत्ति होगी)।
celtschk 19


3

आप टी कमांड का उपयोग कर सकते हैं , बस इसे STDERR फाइल के साथ फीड करें, उदाहरण के लिए:

tee /dev/stderr
tee /proc/self/fd/2

तो उस स्थिति में आपका उपनाम शायद:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

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