सवाल 'टी' का उद्देश्य क्या है?


के सभी उपयोग tee मैंने कभी देखा था:

 do_something | tee -a logfile

या:

do_something_else | tee logfile

है tee उन लोगों के लिए आविष्कार किया जो नहीं जानते कि आप शैल पाइप पुनर्निर्देशन के साथ ऐसा कर सकते हैं? जैसे कि:

do_something >> logfile

या:

do_something_else > logfile

यह व्यावहारिक रूप से वही है और इसे टाइप करने के लिए कम कीबोर्ड हिट लगता है। मैं किस छिपी हुई सुविधाओं को नहीं देख रहा हूं tee?


86
2017-09-10 11:14


मूल


मैन पेज की पहली पंक्ति द्वारा इसका उत्तर कैसे दिया गया था "... और मानक आउटपुट और फाइलों को लिखें"? जवाब दिलचस्प हैं, लेकिन व्यापक रूप से इस बात के बारे में बात करते हुए कि पाइप कैसे उपयोगी हैं, यह केवल क्यू प्रतीत होता है कि यह क्यू कैसे लगता है बहुत चौड़ा, और शायद बंद कर दिया जाना चाहिए। - Xen2050
@ Xen2050 एक व्यापक जवाब के लिए एक प्रश्न को दोषी नहीं ठहराया जा सकता है। सवाल वर्तमान है, जैसा कि बहुत विशिष्ट है उच्चतम रेटेड उत्तर। - Jon Bentley
@ जोनबेंटले सवाल ऐसा नहीं लगता है "एक पर्याप्त समस्या की पहचान करने के लिए पर्याप्त विवरण के साथ एक विशिष्ट समस्या" (जैसा कि निकट संवाद पढ़ता है)। यह इस तरह की आवाज करता है: "अगर आपके प्रश्न का उत्तर संपूर्ण पुस्तक द्वारा दिया जा सकता है, या आपके पास कई वैध उत्तर हैं (लेकिन यह निर्धारित करने का कोई तरीका नहीं है कि - यदि कोई है - सही है), तो यह संभवतः हमारे प्रारूप के लिए बहुत व्यापक है।" (स्रोत: द सहायता केंद्र) - Xen2050
@ Xen2050 क्या हम एक ही प्रश्न पढ़ रहे हैं? यह मेरे लिए बहुत विशिष्ट लगता है - टी और पाइप के बीच क्या अंतर है? इसे दो वाक्यों का उपयोग करके पर्याप्त रूप से उत्तर दिया गया है। एक पूरी किताब से बहुत दूर। तथ्य यह है कि कुछ जवाब चुनें एक स्पर्शरेखा पर जाने के लिए सवाल के दायरे से कोई लेना देना नहीं है। - Jon Bentley
@ जोनबेंटले: क्या हम एक ही प्रश्न पढ़ रहे हैं? RMoog तरह की तरह का तात्पर्य एक काफी अच्छी तरह से केंद्रित सवाल - बीच क्या अंतर है tee  तथा I / O पुनर्निर्देशन?तथ्य यह है कि यह कहते हैं "खोल पाइप पुनर्निर्देशन


जवाब:


जो आप नहीं देखते वह वह है do_something | tee -a logfile आउटपुट डालता है logfile  तथा जबकि, stdout करने के लिए do_something >> logfile रखते है केवल लॉगफाइल में।

का उद्देश्य है tee एक इनपुट, एकाधिक आउटपुट परिदृश्य का उत्पादन करना है - बस 'टी' क्रॉसिंग की तरह।

संपादित करें

कैसे चारों ओर टिप्पणी की गई है tee अधिक असीमित उपयोग सक्षम बनाता है sudo। यह बिंदु के बगल में है: cat, dd या शायद बेहतर है buffer यदि आपको एकाधिक आउटपुट की आवश्यकता नहीं है, तो बेहतर प्रदर्शन के साथ इस संभावना को प्रदान करें। उपयोग tee इसके लिए क्या डिजाइन किया गया है, इसके लिए यह "क्या भी कर सकता है"


240
2017-09-10 11:22



एकाधिक आउटपुट कुंजी है। tee कई तर्क भी ले सकते हैं और कई फाइलों को एक साथ लिख सकते हैं। - Kamil Maciorowski
मैं इसे एक टीई कहूंगा पाइप ढालना, क्रॉसिंग नहीं (जैसा कि सड़क चौराहे में है?) सामग्री एक तरफ आती है और दोनों तरीकों से बाहर जाती है। - user20574
मैं कैसे उपयोग करूंगा cat इसके बजाय एक सीधा तरीके से tee उदाहरण में echo /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern? echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_pattern काम नहीं करता है, क्योंकि रीडायरेक्ट को गैर-सूडो खोल द्वारा संसाधित किया जाता है। से संबंधित dd, echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_pattern काम करता है, लेकिन dd अक्सर एक अत्यधिक शक्ति है जो विशेष रूप से कम नुकसान करने में सक्षम है sudo। से संबंधित buffer, यह किसी भी RedHat- या उबंटू-आधारित distros में डिफ़ॉल्ट रूप से स्थापित नहीं है मुझे हाथ (या मैकोज़) है ... - Digital Trauma
@EugenRieck मुझे प्राथमिक कार्य होने के दौरान: 1: n संबंधों के बारे में अपना बिंदु प्राप्त होता है। हालांकि, न तो बिल्टिन cat न /bin/cat इस स्थिति में मेरे लिए काम करो। इससे कोई फर्क नहीं पड़ता cat से आता है > अभी भी शीर्ष स्तर (गैर-सूडो) खोल द्वारा संभाला जाएगा। का लाभ tee ऊपर cat इस स्थिति में यह है कि यह आउटपुट फ़ाइल को कमांड लाइन पैरा (और रीडायरेक्ट नहीं) के रूप में पारित करने की अनुमति देता है। dd निश्चित रूप से एक व्यवहार्य विकल्प है, हालांकि मैं अभी भी पक्षपात करता हूं tee इसके लिए - Digital Trauma
@EugenRieck क्या खोल है cat तथा tee बिल्टिन के रूप में? और किस संस्करण का sudo शैल बिल्टिन चला सकते हैं? - wjandrea


Tee बेकार नहीं है

शायद आप जानते थे कि वैसे भी? यदि नहीं, तो पढ़ें! या यदि आप जानते हैं कि यह कैसे काम करता है, लेकिन निश्चित नहीं हैं क्यूं कर यह अस्तित्व में है, यह देखने के लिए अंत में छोड़ें कि यह यूनिक्स दर्शन के साथ कैसे फिट है।

क्या है का उद्देश्य है tee?

अपने सबसे सरल पर, यह मानक इनपुट पर डेटा लेता है और लिखता है कि मानक आउटपुट और एक (या अधिक) फ़ाइलों को। इसकी तुलना एक की तुलना में की गई है नलसाजी टी टुकड़ा जिस तरह से यह एक इनपुट को दो आउटपुट (और दो दिशाओं) में विभाजित करता है।

उदाहरण

आइए अपना पहला उदाहरण लें:

do_something | tee -a logfile

यह उत्पादन लेता है do_something और इसे लॉगफाइल में जोड़ता है, जबकि इसे उपयोगकर्ता को भी प्रदर्शित करता है। वास्तव में, विकिपीडिया पेज पर tee यह दूसरा उदाहरण है:

आउटपुट को किसी मौजूदा फ़ाइल से आउटपुट देखने और जोड़ने के लिए:

  lint program.c | tee -a program.lint

यह कंप्यूटर पर lint program.c कमांड का मानक आउटपुट प्रदर्शित करता है और साथ ही प्रोग्राम की एक फ़ाइल को प्रोग्राम.लिंट फ़ाइल के अंत में जोड़ता है। यदि प्रोग्राम.लिंट फ़ाइल मौजूद नहीं है, तो यह बनाया गया है।

अगले अगले उदाहरण का एक और उपयोग है: अनुमतियों की वृद्धि:

अनुमतियों की वृद्धि की अनुमति देने के लिए:

cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"

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

या शायद आप एक कमांड का आउटपुट लेना चाहते हैं, कहीं कहीं लिखें और इसे किसी अन्य कमांड में इनपुट के रूप में भी इस्तेमाल करें?

आप एक कमांड के आउटपुट को फ़ाइल में संग्रहीत करने के लिए टीई कमांड का उपयोग भी कर सकते हैं और उसी आउटपुट को किसी अन्य कमांड में इनपुट के रूप में रीडायरेक्ट कर सकते हैं।

निम्न आदेश crontab प्रविष्टियों का बैकअप लेगा, और crontab प्रविष्टियों को sed कमांड में इनपुट के रूप में पास करेगा जो प्रतिस्थापन करेगा। प्रतिस्थापन के बाद, इसे एक नए क्रॉन नौकरी के रूप में जोड़ा जाएगा।

$ crontab -l | tee crontab-backup.txt | sed 's/old/new/' | crontab –

(को श्रेय टी कमांड उपयोग उदाहरण)

Tee यूनिक्स दर्शन के साथ काम करता है:

ऐसे कार्यक्रम लिखें जो एक काम करते हैं और इसे अच्छी तरह से करते हैं। एक साथ काम करने के लिए कार्यक्रम लिखें। टेक्स्ट स्ट्रीम को संभालने के लिए प्रोग्राम लिखें, क्योंकि यह एक सार्वभौमिक इंटरफ़ेस है।

(को श्रेय यूनिक्स दर्शनशास्त्र की मूल बातें)

tee इन सभी में फिट बैठता है:

  • यह एक बात करता है: इनपुट की एक अतिरिक्त प्रति बनाता है
  • यह अन्य कार्यक्रमों के साथ काम करता है क्योंकि यह गोंद (या यदि आप पसंद करते हैं तो 'टी' नलसाजी टुकड़ा) जो अन्य कार्यक्रमों को ऊपर दिए गए उदाहरणों में एक साथ काम करने देता है
  • यह मानक इनपुट पर दी गई एक टेक्स्ट स्ट्रीम में हेरफेर करके ऐसा करता है

118
2017-09-10 11:23



@Joe: sudo tee -a शायद हाल ही में एक नया नवाचार है (मैंने इसे पहले उबंटू गाइड / विकिस में देखा था, विशेष रूप से सामान स्थापित करने के लिए /proc/sys, क्योंकि उबंटू में स्विच करना तब था जब मैंने एक स्विच किया था sudo आधारित प्रणाली (कैसे उबंटू डिफ़ॉल्ट रूप से कॉन्फ़िगर किया गया है) का उपयोग करने के बजाय su रूट पासवर्ड के साथ)। मुझे लगता है tee पहले का है sudo, तो यह एक कारण नहीं है tee मौजूदा। आपको जरूरत नहीं है tee इसके लिए, यह तुलनात्मक रूप से टाइप करने के लिए बस छोटा है sudo sh -c 'cat > output'। - Peter Cordes
बाश जैसे आधुनिक गोले के साथ, आप कर सकते हैं tee जैसे दो पाइपलाइनों को खिलाने के लिए foo | tee >(pipe2) | pipe1। या एक और मजेदार है ffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.logवास्तविक लॉगिंग के लिए नई लाइन की बजाय कैरिज-रिटर्न के साथ समाप्त होने वाली "रेखाएं" को हटाते समय, टाटा पर इंटरैक्टिव रूप से स्टेटस-लाइन अपडेट देखने के लिए। (यानी स्थिति-रेखा अद्यतनों को फ़िल्टर करें)। आम तौर पर, आप एक छड़ी कर सकते हैं tee /dev/tty एक डीबग प्रिंट के रूप में एक पाइपलाइन में कहीं भी। - Peter Cordes
यह सूडो की एक सीमा है जो आप काम कर रहे हैं और शैल की व्याख्या की सीमा अधिक है। जब आप सुडो के साथ कमांड चलाते हैं तो इसके स्टडआउट को आपके शैल प्रोग्राम पर वापस भेज दिया जाता है और आगे के रीडायरेक्ट> शैल की अनुमतियों के साथ चलाए जाते हैं। यदि आप ऊंचा अनुमतियों के साथ लिखना चाहते हैं तो आपको पाइपलाइन का ऊंचा हिस्सा होना चाहिए जो लेखन करता है। इस पर निर्भर करता है कि आप किस प्रभाव के लिए जा रहे हैं इसके आधार पर ऐसा करने के कई तरीके हैं। यदि आप वास्तव में उपयोग करना चाहते हैं> 'sudo bash -c' कमांड> outfile "जैसी कुछ चीज़ नौकरी करेगी। - Perkins
बिल्कुल, @ पर्किन्स। खोल पार्स करता है > और सूडो को पाने से पहले पुनर्निर्देशन भी सेट करता है exec'डी, तो यह है निश्चित रूप से सूडो की सीमा नहीं है कि यह उन चीज़ों को संभाल नहीं पाती है जो इसे कभी नहीं देखती हैं। :) मैं आमतौर पर इसे "सूडो वर्कफ़्लो" या कुछ समान शब्द के रूप में संदर्भित करने का प्रयास करता हूं, जब मैं इसे समझ रहा हूं, सूडो स्वयं का वर्णन करने के बजाय। - dannysauer
sudo tee -a आईएमएचओ टी का दुरुपयोग है। उपयोग sudo cat, sudo dd या (कई मामलों में सर्वश्रेष्ठ प्रदर्शन के साथ) sudo buffer अगर आपको एकाधिक आउटपुट की आवश्यकता नहीं है। - Eugen Rieck


यह व्यावहारिक रूप से वही है और इसे टाइप करने के लिए कम कीबोर्ड हिट लगता है।

यह बिल्कुल वही नहीं है ...

निम्नलिखित कुछ हद तक समतुल्य प्रतीत होते हैं, लेकिन वे नहीं हैं:

$ echo "hi" > test.txt
$ echo "hi" | tee test.txt
hi

महत्वपूर्ण अंतर यह है कि पूर्व ने केवल नामित फ़ाइल में डेटा लिखा है, जबकि उत्तरार्द्ध ने लिखा है hi टर्मिनल के लिए (stdout) तथा नामित फ़ाइल, जैसा कि नीचे दिखाया गया है:

redirect vs tee


tee आपको डेटा को डेटा लिखने की अनुमति देता है तथा इसे एक आगे की पाइपलाइन में उपयोग करें, जिससे आप उपयोगी चीजें कर सकें - जैसे कि पाइपलाइन के माध्यम से डेटा को डेटा से रखना:

grep '^look ' interesting_file.txt \
  | tee interesting_lines.txt \
  | sort

या, आप पूरी पाइपलाइन उन्नत विशेषाधिकार दिए बिना, ऊंचे विशेषाधिकार वाली फ़ाइल पर लिख सकते हैं (यहां echo उपयोगकर्ता के रूप में चलाया जाता है, जबकि tee फ़ाइल के रूप में लिखता है root):

echo 0 \
  | sudo tee /proc/sys/net/ipv4/ip_forward

साथ में tee, आप कई फाइलों को लिख सकते हैं (तथा  stdout):

echo "hi" \
  | tee a.txt b.txt

इसका उपयोग करना भी संभव है exec साथ में tee एक स्क्रिप्ट के आउटपुट को फ़ाइल में रिकॉर्ड करने के लिए, जबकि अभी भी एक पर्यवेक्षक की अनुमति है (stdout) डेटा देखने के लिए:

exec > >( tee output.log )

68
2017-09-10 11:29



भूलना नहीं exec > >(tee "$LOGFILE") 2>&1 एक बैश स्क्रिप्ट में जो स्क्रिप्ट आउटपुट stdout और stderr दोनों को stdout और फ़ाइल द्वारा इंगित करने देता है $LOGFILE। - rexkogitans
@rexkogitans 2> और 1 वह cmd बैच वाक्यविन्यास नहीं है? - dmb
@dmb: यह stdout (= 1) के समान स्थान पर "stderr (= 2) भेजने के लिए खोल वाक्यविन्यास है" - psmears
@rexkogitans यह वास्तव में एक उचित सवाल था, मैं वास्तव में नहीं जानता कि आपने एक दशक के लिए "विंडोज़" का उपयोग नहीं किया है। मैं उपयोग करता हूं 2>&1 आउटपुट ड्रॉप करने और विंडोज़ में फ़ाइलों को txt करने के लिए गलती। - dmb
@ डीएमबी मुझे कठोर लगने के लिए खेद है। यह सब psmears की टिप्पणी के बारे में है। जाहिर है, विंडोज ने यूनिक्स शैली को यहां अपनाया। - rexkogitans


यह एक टीई है:
enter image description here

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

इसी तरह, tee एक पाइप है (|) जो आपको अपने मानक इनपुट को दो अलग-अलग आउटपुट पर रीडायरेक्ट करने की अनुमति देता है।


उदाहरण
उदाहरण के लिए कहें, आप टाइप करें ls /
आपको ऐसा आउटपुट मिलेगा जो कुछ ऐसा दिखता है:

Applications    Network     Users       bin        dev      net      private    tmp         var
Library         System      Volumes     cores      etc      home     opt        sbin        usr

आउटपुट को एक टेक्स्ट फ़ाइल में रीडायरेक्ट करें, ls / > ls.txt, और शेल में कोई आउटपुट प्रदर्शित नहीं होता है, केवल परिणामी पाठ फ़ाइल में।

आउटपुट देखना चाहते हैं, और एक ही समय में एक टेक्स्ट फ़ाइल में पास करना चाहते हैं?
एक जोड़ें tee अपनी पाइप के लिए (|) अर्थात: ls / | tee ls.txt


दो की तुलना करें:

ls /          >          ls.txt
ls /        | tee        ls.txt

25
2017-09-11 16:26



तस्वीर के लिए +1 जो हम जानते हैं हजारों शब्दों के लायक है - Sergiy Kolodyazhnyy
यदि आपने बगीचे होसेपिप टी टुकड़ा उठाया था, तो आप डौग मैक्लॉयय के मूल रूपक के साथ लाइन में होंगे। - JdeBP
@JdeBP क्षमा करें, मुझे नहीं पता कि वह कौन है। क्या वह उपयोगिता या कुछ का मूल लेखक है? डेटा और भौतिक विद्युत प्रवाह का प्रवाह अक्सर हाइड्रोलिक सिस्टम से तुलना की जाती है, लेकिन आप शायद इसे जानते हैं। वैसे भी, मैंने इसे इस शैली को बहुत सरल रखने के लिए चुना है। मैं वास्तव में इसे परिचित रखने के लिए ऐसा करने जा रहा था, लेकिन बगीचे की विविधता में वाई-आकार और / या सहायक उपकरण संलग्न करने के लिए दृष्टि से जटिल अनुलग्नक होते हैं। यह अनिवार्य रूप से वही है। - tjt263
एम डगलस मैकइलॉय, लेखक यह प्रसिद्ध ज्ञापन कौन बेल लैब्स में काम किया तथा यूनिक्स में पाइप लगाने के लिए केन थॉम्पसन को राजी किया। - JdeBP


नहीं। आपको कुछ उदाहरणों में से एक का उल्लेख करना है जहां आप वास्तव में फ़ाइल का उपयोग कर रीडायरेक्ट कर सकते हैं > तथा >> ऑपरेटरों।

लेकिन टी बहुत कुछ कर सकते हैं। क्योंकि आप इसे पाइप करते हैं, फिर आप किसी और चीज को पाइप कर सकते हैं।

एक अच्छा उदाहरण सूचीबद्ध है विकिपीडिया पेज:

find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt

असल में, आप टी को पाइप कर सकते हैं, ताकि आप टी से कुछ और पाइप कर सकें। यदि आप बस एक लॉग फ़ाइल लिखना चाहते हैं, तो हाँ, आपको वास्तव में टी की आवश्यकता नहीं है।


17
2017-09-10 11:21





tee बेकार से दूर है। मैं हर समय इसका इस्तेमाल करता हूं और खुश हूं कि यह अस्तित्व में है। यदि आपके पास एक पाइपलाइन है जिसे आप विभाजित करना चाहते हैं तो यह एक बहुत ही उपयोगी टूल है। एक बहुत ही सरल उदाहरण यह है कि आपके पास कुछ निर्देशिका है $dकि आप टैर करना चाहते हैं और आप इसे भी हैश करना चाहते हैं क्योंकि आप पागल हैं (जैसे मैं हूं) और डेटा को भरोसेमंद रखने के लिए स्टोरेज माध्यम पर भरोसा नहीं करता हूं। आप सकता है इसे पहले डिस्क पर लिखें और उसके बाद हैश करें, लेकिन यदि यह धोने से पहले संग्रह दूषित हो जाता है तो यह असफल हो जाता है। इसके अलावा, आपको इसे पढ़ना होगा और यदि आप उन फ़ाइलों पर काम करते हैं जो आकार में कई सौ जीबी हैं, तो आपको पता चलेगा कि यदि आप ऐसा नहीं करना चाहते हैं तो आप वास्तव में उन्हें फिर से पढ़ना नहीं चाहते हैं।

तो मैं बस इतना करता हूं कि यह है:

tar -c "$d" | tee >(sha256sum) >(cat > "$d"".tar") > /dev/null

यह टार बॉल बनाता है और पाइप को टी करने के लिए बनाता है जो उसके बाद दो उप-गोले में पाइप करता है, जिसमें से एक में यह धोया जाता है और जिसमें से यह डिस्क पर लिखा जाता है।

यदि आप बड़ी फ़ाइल पर कई संचालन करना चाहते हैं तो यह भी बढ़िया है:

< file.tar.gz tee >(sha256sum) >(tar -xz) /other/storage/location/file.tar.gz > /dev/null

फ़ाइल को एक बार पढ़ता है, इसे धोता है (ताकि आप जांच सकें कि यह अभी भी होना चाहिए), इसे निकालता है, और इसे किसी दूसरे स्थान पर कॉपी करता है। इसके लिए तीन बार इसे पढ़ने की जरूरत नहीं है।


16
2017-09-10 15:31



nitpick: tee सबहेल्स नहीं बनाते हैं; कॉलिंग खोल चलता है sha5sum तथा cat और उनके आउटपुट को फाइल डिस्क्रिप्टर को जोड़ता है जो पास किए जाते हैं tee। इसके अलावा, का बेकार उपयोग cat; आप इनपुट पुनर्निर्देशन का उपयोग कर सकते हैं teeसे सीधे पढ़ें file.tar.gz। - chepner
@chepner आप पहले इंजेक्शन के बारे में सही हैं लेकिन आप दूसरे के बारे में पूरी तरह से गलत हैं। मुझे अपनी पाइपलाइनों को क्रम में लिखना पसंद है, इसलिए दाईं ओर इनपुट को इंगित करना पठनीयता के लिए भयानक है और ऐसा करना मेरे तरीके से स्पष्ट रूप से कम है और पूरी तरह से मेरी एक व्यक्तिपरक प्राथमिकता नहीं है। cat प्यर है। cat जीवन है। - UTF-8
आप भी लिख सकते हैं < file.tar.gz tee >(sha256sum) ... यदि आप पुनर्निर्देशन के व्याख्यात्मक आदेश के बारे में चिंतित हैं। यह इस तथ्य को नहीं बदलेगा कि एक फ़ाइल को खिलाने के लिए पूरी तरह से अलग प्रक्रिया की आवश्यकता नहीं है tee। - chepner
@chepner कूल, धन्यवाद! आज कुछ सीख लिया। :) - UTF-8
की क़ीमत शुरुआत में  cat अपेक्षाकृत कम है। लिखने के अतिरिक्त 100 जीबी की लागत + पढ़ने प्रणाली कॉल एक बड़ी फ़ाइल के आपके प्रस्तावित उदाहरण के लिए निश्चित रूप से अतिरिक्त CPU समय और मेमोरी बैंडविड्थ को बर्बाद कर देती है। याद रखें कि मेमोरी बैंडविड्थ सभी कोरों में एक साझा संसाधन है, उस प्रतिलिपि से एल 3 कैश के अतिरिक्त प्रदूषण का उल्लेख न करें। स्पेक्ट्रर + मेलडाउन शमन सक्षम के साथ एक x86 पर, सिस्टम कॉल की तुलना में अधिक महंगी होती है। आप उस प्रतिलिपि के दौरान अतिरिक्त CPU समय की एक मापनीय मात्रा का उपयोग कर रहे हैं। भी >(cat > foo) से समझना आसान नहीं है foo, आईएमओ। - Peter Cordes


@ Bertieb के जवाब पर Nitpick कहते हैं यह उदाहरण सूडो कमांड में अंतर्निहित सीमा को बाईपास करने के लिए प्रयोग किया जाता है। sudo मानक आउटपुट को फ़ाइल में पाइप करने में असमर्थ है।

कोई अंतर्निहित सीमा नहीं है, केवल एक गलतफहमी है कि आदेश कैसे संसाधित किया जाता है।

उदाहरण:

sudo echo 0 > /proc/sys/net/ipv4/ip_forward

वर्तमान खोल कमांड लाइन पार्स। यह आउटपुट रीडायरेक्शन पाता है और इसे करता है। फिर यह आदेश निष्पादित करता है, जो है sudo और निष्पादित कमांड के लिए तर्क के रूप में शेष कमांड लाइन प्रदान करता है। यदि वर्तमान खोल में रूट अनुमति नहीं है, तो आउटपुट रीडायरेक्शन विफल हो जाएगा।

echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward

यह काम करता है क्योंकि आउटपुट रीडायरेक्शन को स्थगित कर दिया जाता है tee कमांड, जिस बिंदु पर रूट अनुमतियां होती हैं क्योंकि इसे निष्पादित किया गया था sudo

sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"

यह काम करता है क्योंकि पुनर्निर्देशन करने वाले खोल में रूट अनुमतियां होती हैं।


11
2017-09-10 14:33



इसके अलावा, आपको आवश्यकता हो सकती है sudo आदेश के लिए, लेकिन फ़ाइल आउटपुट के लिए नहीं है और पुनर्निर्देशन ठीक काम करता है: sudo foo-needs-privilege > /tmp/this-output-file-doesnt - Dennis Williamson


जैसा कि अन्य लोगों ने उल्लेख किया है, आउटपुट पाइपिंग tee कमांड लिखता है कि एक फाइल दोनों को आउटपुट और stdout करने के लिए।

मैं अक्सर उपयोग करता हूं tee जब मैं एक कमांड से आउटपुट कैप्चर करना चाहता हूं जो रन करने में लंबा समय लेता है, जबकि आउटपुट को दृष्टि से निरीक्षण करना भी चाहता है क्योंकि कमांड इसे उपलब्ध कराता है। इस तरह, मुझे आउटपुट का निरीक्षण करने से पहले कमांड को चलाने के लिए इंतजार नहीं करना पड़ेगा।

ऐसा अभी तक उल्लेख नहीं किया गया है (जब तक कि मैं इसे याद नहीं करता), वह है tee कमांड एक साथ कई फाइलों को भी लिख सकता है। उदाहरण के लिए:

ls *.png | tee a.txt b.txt

सभी लिखेंगे *.png वर्तमान निर्देशिका में फ़ाइलों को दो अलग-अलग फाइलों में (a.txt तथा b.txt) तुरंत।

वास्तव में, आप एक साथ कई अलग-अलग फ़ाइलों को टेक्स्ट टाइप कर सकते हैं tee इस तरह:

$ tee --append a.txt b.txt c.txt d.txt
These lines are appended to four different files,
and are also written to stdout.
CTRL-D

9
2017-09-10 17:22