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


90

teeमैंने कभी देखा सभी usages की तरह थे:

 do_something | tee -a logfile

या:

do_something_else | tee logfile

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

do_something >> logfile

या:

do_something_else > logfile

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


62
मैन पेज की पहली लाइन "... और स्टैंडर्ड आउटपुट एंड फाइल्स" में इसका उत्तर कैसे नहीं दिया गया । उत्तर दिलचस्प हैं, लेकिन मोटे तौर पर इस बारे में बात करना कि पाइप कैसे उपयोगी हैं, यह पुष्ट करता है कि यह क्यू बहुत व्यापक लगता है, और शायद बंद होना चाहिए।
Xen2050 1:12 बजे

3
@ Xen2050 एक प्रश्न को बहुत व्यापक उत्तर के लिए दोषी नहीं ठहराया जा सकता है। सवाल बहुत विशिष्ट है, जैसा कि वर्तमान उच्चतम रेटेड उत्तर है
जॉन बेंटले

1
@JonBentley प्रश्न "पर्याप्त उत्तर की पहचान करने के लिए पर्याप्त विवरण के साथ एक विशिष्ट समस्या" (जैसा कि निकट संवाद पढ़ता है) ध्वनि नहीं करता है । यह इस तरह से ध्वनि करता है: "यदि आपके प्रश्न का उत्तर पूरी पुस्तक द्वारा दिया जा सकता है, या उसके पास कई वैध उत्तर हैं (लेकिन यह निर्धारित करने का कोई तरीका नहीं है - यदि कोई - यदि सही है), तो यह संभवतः हमारे प्रारूप के लिए बहुत व्यापक है।" (स्रोत: हेल्प सेंटर )
Xen2050

4
@ Xen2050 क्या हम एक ही सवाल पढ़ रहे हैं? यह मेरे लिए अत्यधिक विशिष्ट लगता है - टी और पाइप के बीच क्या अंतर है? दो वाक्यों का उपयोग करके इसका पर्याप्त उत्तर दिया गया है। एक पूरी किताब से दूर। तथ्य यह है कि कुछ जवाब एक स्पर्शरेखा पर जाने के लिए चुनते हैं सवाल के दायरे के साथ कुछ नहीं करना है।
जॉन बेंटले

@JonBentley: क्या हम एक ही सवाल पढ़ रहे हैं? मोग की तरह की तरह एक काफी अच्छी तरह से ध्यान केंद्रित सवाल का तात्पर्य है - tee और मैं / हे पुनर्निर्देशन के बीच क्या अंतर है ?   तथ्य यह है कि यह कहता है "खोल पाइप पुनर्निर्देशन जैसे " >और >>इसके पक्ष में एक बिंदु नहीं है, और अस्पष्ट के रूप में बंद करने के लिए एक तर्क है। लेकिन यह वास्तव में कई सवाल पूछता है: "इसका उद्देश्य क्या है tee?", " teeउन लोगों के लिए आविष्कार किया गया है जो नहीं जानते कि आप शेल पाइप पुनर्निर्देशन के साथ भी ऐसा कर सकते हैं tee?" उनमें से कम से कम दो प्रश्न बहुत व्यापक हैं।
जी-मैन

जवाबों:


242

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

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

संपादित करें

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


37
एकाधिक आउटपुट कुंजी है। teeयहां तक ​​कि कई तर्क भी ले सकते हैं और एक साथ कई फाइलों को लिख सकते हैं।
कामिल मैकियोरोस्की

20
मैं इसे एक टी पाइप फिटिंग कहूंगा , क्रॉसिंग नहीं (सड़क चौराहे के रूप में?) स्टफ एक तरह से आता है और दोनों तरह से बाहर निकलता है।
user20574

7
उदाहरण के लिए cat, मैं सीधे तरीके से कैसे उपयोग करूंगा ? काम नहीं करता है, क्योंकि रीडायरेक्ट गैर-सूडो शेल द्वारा संसाधित होता है। के रूप में , काम करता है, लेकिन अक्सर एक जबरदस्त उपकरण है जो विशेष रूप से बहुत नुकसान पहुंचाता है । के रूप में , इसके RedHat- या उबंटू-आधारित डिस्ट्रोस में से किसी में भी डिफ़ॉल्ट रूप से स्थापित नहीं है मुझे हाथ (या MacOS) ...teeecho /var/work/core.%p | sudo tee /proc/sys/kernel/core_patternecho /var/work/core.%p | sudo cat > /proc/sys/kernel/core_patternddecho /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_patternddsudobuffer
डिजिटल ट्रॉमा

3
@EugenRieck मैं प्राथमिक फ़ंक्शन होने के बीच में 1: n संबंध के बारे में आपकी बात बताता हूं। हालांकि, इस स्थिति में न तो बिलिन catऔर न ही /bin/catमेरे लिए काम। इससे कोई फर्क नहीं पड़ता कि catकहां से आता है - >अभी भी शीर्ष स्तर (गैर-सूडो) शेल द्वारा नियंत्रित किया जाएगा। इस स्थिति में teeओवर का लाभ catयह है कि यह आउटपुट फाइल को कमांड-लाइन परम (और अनुप्रेषित नहीं) के रूप में पारित करने की अनुमति देता है। dd, निश्चित रूप से एक व्यवहार्य विकल्प है, हालांकि मैं अभी भी पक्ष चाहते हैं teeइस के लिए
डिजिटल ट्रामा

3
@EugenRieck क्या शेल catऔर बिल्डिन्स के teeरूप में है? और sudoशेल बिल्डरों का कौन सा संस्करण चल सकता है?
wjandrea

118

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

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

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

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

उदाहरण

चलो अपना पहला उदाहरण लेते हैं:

do_something | tee -a logfile

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

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

  lint program.c | tee -a program.lint

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

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

अनुमतियाँ बढ़ाने के लिए:

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

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

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

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

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

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

( Tee कमांड उपयोग उदाहरण के लिए क्रेडिट )

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

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

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

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

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

3
@Joe: sudo tee -aशायद एक और अधिक हाल के नवाचार है (मैं पहली बार यह Ubuntu गाइड में / विकिज़ विशेष रूप से में सामान की स्थापना के लिए देखा था /proc/sys, क्योंकि Ubuntu का उपयोग करने जा रहा था जब मैं एक में स्विच sudoआधारित सिस्टम (कैसे Ubuntu डिफ़ॉल्ट रूप से कॉन्फ़िगर किया गया है) के बजाय का उपयोग कर suएक साथ रूट पासवर्ड)। मुझे लगता है कि teeभविष्यवाणी करता है sudo, इसलिए यह teeमौजूदा का कारण नहीं है । आपको इसकी आवश्यकता नहीं teeहै, यह केवल अंतःक्रियात्मक रूप से टाइप करने के लिए छोटा है sudo sh -c 'cat > output'
पीटर कॉर्ड्स

1
बैश जैसे आधुनिक गोले के साथ, आप teeदो पाइपलाइनों को खिला सकते हैं , जैसे foo | tee >(pipe2) | pipe1। या फिर एक और मज़ेदार बात यह ffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.logहै कि स्टेटस-लाइन अपडेट को टैटी पर अंतःक्रियात्मक रूप से देखना है, जबकि "लॉग्स" को हटा देना है जो वास्तविक लॉगिंग के लिए न्यूलाइन के बजाय गाड़ी-वापसी के साथ समाप्त होता है। (यानी स्टेटस-लाइन अपडेट को फ़िल्टर करें)। सामान्य तौर पर, आप tee /dev/ttyएक पाइपलाइन में डिबग-प्रिंट के रूप में कहीं भी चिपक सकते हैं ।
पीटर कॉर्ड्स

2
यह सूडो की एक सीमा से कम है जो आप चारों ओर काम कर रहे हैं और शेल की व्याख्या की एक सीमा है>। जब आप sudo के साथ एक कमांड चलाते हैं तो इसके स्टडआउट को आपके शेल प्रोग्राम में वापस भेज दिया जाता है और शेल के परमिशन के साथ> को रीडायरेक्ट किया जाता है। यदि आप एलिवेटेड अनुमतियों के साथ लिखना चाहते हैं तो आपको पाइपलाइन के ऊंचे हिस्से को लिखने की आवश्यकता है। यह करने के लिए कि आप किस प्रभाव के लिए जा रहे हैं, इसके आधार पर बड़ी संख्या में तरीके हैं। यदि आप वास्तव में> सुडू बैश -c "कमांड> आउटफिट" जैसी किसी चीज का उपयोग करना चाहते हैं, तो यह काम करेगा।
पर्किन्स

बिल्कुल, @ पर्किन्स। शेल पार्स करता है >और सुडो से पहले पुनर्निर्देशन सेट करता है यहां तक ​​कि execडी भी मिलता है , इसलिए यह निश्चित रूप से सुडो की सीमा नहीं है कि यह उन चीजों को नहीं संभालता है जो इसे कभी नहीं देखता है। :) मैं आमतौर पर इसे "sudo वर्कफ़्लो" या कुछ इसी तरह के शब्द के रूप में संदर्भित करने का प्रयास करता हूं जब मैं इसे समझा रहा हूं, न कि स्वयं sudo का वर्णन करने के बजाय।
dannysauer

sudo tee -aIMHO टी का दुरुपयोग है। उपयोग करें sudo cat, sudo ddया (कई मामलों में सर्वश्रेष्ठ प्रदर्शन के साथ) sudo bufferयदि आपको कई आउटपुट की आवश्यकता नहीं है।
यूजेन रीक

70

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

ऐसा बिल्कुल नहीं है ...

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

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

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

रीडायरेक्ट बनाम टी


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 )

2
exec > >(tee "$LOGFILE") 2>&1एक बाश स्क्रिप्ट में नहीं भूलना , जो स्क्रिप्ट आउटपुट को stdout और stderr दोनों को देती है, stdout और फ़ाइल को इंगित करती है $LOGFILE
rexkogitans

@rexkogitans 2> और 1 cmd बैच सिंटैक्स नहीं है?
DMB

@ mdb: यह "सिलेडर (= 2) को stdout (= 1) के समान स्थान पर भेजने के लिए शेल सिंटैक्स है
Psmears

@rexkogitans यह वास्तव में एक उचित प्रश्न था, मैं वास्तव में नहीं जान सकता कि आपने एक दशक तक "विंडोज़" का उपयोग नहीं किया है। मैं 2>&1आउटपुट ड्रॉप करने के लिए और विंडोज़ में फ़ाइलों को txt करने के लिए उपयोग करता हूं ।
dmb

1
@ mdb मुझे अशिष्टता के लिए खेद है। यह सब Psmears की टिप्पणी के बारे में है। जाहिर है, विंडोज ने यहां यूनिक्स-शैली को अपनाया।
rexkogitans

27

यह एक टी है:
यहाँ छवि विवरण दर्ज करें

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

इसी तरह, 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

4
चित्र के लिए +1 जो हम जानते हैं कि एक हजार शब्दों के लायक है
सर्गी कोलोडाज़नी

यदि आपने एक बाग़ का नली का टुकड़ा टी पीस लिया होता, तो आप डौग मैकलारियो के मूल रूपक के अनुरूप होते।
JdeBP

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


18

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

लेकिन टी अधिक कर सकते हैं। क्योंकि आप इसे पाइप करते हैं, तो आप किसी और चीज़ से पाइप कर सकते हैं।

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

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

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


17

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

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


3
नाइटपिक: उपधाराओं का teeनिर्माण नहीं करता है; कॉलिंग शेल चलता है sha5sumऔर catअपने आउटपुट को फाइल डिस्क्रिप्टर में जोड़ता है जो पास हो जाते हैं tee। इसके अलावा, का एक बेकार उपयोग cat; आप teeसीधे रीडायरेक्ट इनपुट का उपयोग कर सकते हैं file.tar.gz
चेपनर

@chepner आप पहली आपत्ति के बारे में सही हैं लेकिन आप दूसरे के बारे में पूरी तरह से गलत हैं। मुझे अपनी पाइपलाइनें क्रम में लिखना पसंद है, इसलिए दाईं ओर इनपुट को चिह्नित करना पठनीयता के लिए भयानक है और ऐसा करना स्पष्ट रूप से मेरे तरीके से नीच है और पूरी तरह से मेरा एक व्यक्तिपरक वरीयता नहीं है। catप्यर है। catजीवन है।
UTF-8

6
आप यह भी लिख सकते हैं < file.tar.gz tee >(sha256sum) ...कि क्या आप रीडायरेक्ट के शाब्दिक क्रम के बारे में चिंतित हैं। यह इस तथ्य को नहीं बदलता है कि किसी एकल फ़ाइल को खिलाने के लिए पूरी तरह से अलग प्रक्रिया की आवश्यकता नहीं है tee
शेपनर

1
@chepner कूल, धन्यवाद! आज कुछ सीखा। :)
UTF-8

1
शुरू करने की लागत catअपेक्षाकृत कम है। एक अतिरिक्त 100 GiB लिखने की लागत + रीड सिस्टम कॉल निश्चित रूप से एक विशाल फ़ाइल के आपके प्रस्तावित उदाहरण के लिए अतिरिक्त सीपीयू समय और मेमोरी बैंडविड्थ बर्बाद करती है। याद रखें कि मेमोरी बैंडविड्थ सभी कोर में एक साझा संसाधन है, न कि उस प्रतिलिपि से L3 कैश के अतिरिक्त प्रदूषण का उल्लेख करने के लिए। स्पेक्टर + मेल्टडाउन शमन सक्षम के साथ एक x86 पर, सिस्टम कॉल अधिक महंगे हैं जो वे इस्तेमाल करते थे। आप उस प्रतिलिपि के दौरान अतिरिक्त CPU समय का औसत दर्जे का उपयोग कर रहे हैं। इसके अलावा , IMO >(cat > foo)को समझना आसान नहीं है foo
पीटर कॉर्ड्स

12

@ Bertieb के उत्तर पर नाइटपिक कहता है कि यह उदाहरण दिखाता है कि सूद कमांड में निहित सीमा को दरकिनार करने के लिए इस्तेमाल किया जा रहा है। 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"

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


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

10

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

मैं अक्सर उपयोग करता 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

टी का सबसे आम उपयोग टर्मिनल पर पाठ को देखने के लिए है उसी समय आप इसे फ़ाइल (या फ़ाइलों) पर भेजते हैं। आपके प्रश्न का शब्दांकन यह मानता है कि आप केवल लॉगफ़ाइल्स को पाठ लिखते हैं। मेरे पास स्क्रिप्ट्स हैं जो फ़ाइलों को ट्रिगर करने के लिए फ़ाइलनाम या निर्देशिका नामों की सूची लिखते हैं (एसिंक्रोनस रूप से अन्य लिपियों द्वारा संसाधित होने के लिए) और मैं उसी सामग्री को स्टडआउट भेजने के लिए टी का उपयोग करता हूं। सभी स्टडआउट लॉग्स को निर्देशित किया जाता है। इसलिए मेरे पास मेरा पाठ है जहां मैं चाहता हूं और मेरे पास एक लॉग एंट्री रिकॉर्डिंग है जो मैंने ऐसा किया था, सभी एक ही 'इको स्टेटमेंट' से

टी भी कई समान फाइल बनाने के लिए यूनिक्स में सबसे अच्छी विधि है। मैं इसे कभी-कभार इस तरह से कई खाली फाइलें बनाने के लिए इस्तेमाल करता हूं ...

:|tee file01 file02 file03

5
क्यों नहीं touch? (अधिक तुरंत स्पष्ट क्या हो रहा है)
Attie

@Attie touchफ़ाइलों को काट नहीं देगा यदि वे पहले से मौजूद हैं लेकिन केवल अपने टाइमस्टैम्प को अपडेट करें और अपनी सामग्री को उसी तरह छोड़ दें; लेकिन teeउन्हें छोटा कर देगा। इसके अलावा, करना rm+ touchसे अलग है tee(
हार्डलिंक

फिर क्यों नहीं truncate -s 0? :-)
Attie

1

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

एक उपयोग के मामले में ऐसी स्क्रिप्ट्स का निर्माण होता है जो संपूर्ण बिल्ड को stdout में लिखते हैं (उदाहरण के लिए जेनकिंस के लिए) लेकिन एक ही समय में महत्वपूर्ण सामान एक अलग लॉग फ़ाइल (सारांश ईमेल के लिए) के लिए।

teeजब आप विंडोज में स्क्रिप्ट करना चाहते हैं तो आप वास्तव में गायब होने लगेंगे । नहीं है teeऔर यह वास्तव में कष्टप्रद है।


क्या यह तुच्छ नहीं है?
ऑर्बिट

यह बैच / सेमी के साथ संभव नहीं है क्योंकि आप एक कमांड से आउटपुट की स्ट्रीम को आसानी से विभाजित नहीं कर सकते हैं।
डोमिह

ठीक है, लेकिन तीन-लाइन सी ++ प्रोग्राम की तरह ...
लाइटनेस दौड़ ऑर्बिट में

1
विंडोज unxutils वितरण में कई यूनिक्स कमांड लाइन उपकरण हैं जो कुछ वितरणों के विपरीत, आपके विंडोज निष्पादन वातावरण को प्रदूषित नहीं करते हैं। सबसे बड़ी सीमा "ग्लोब" बिंग पर है, जो विंडोज की तुलना में यूनिक्स / लिनक्स पर अलग तरह से काम करता है। "टी" उपलब्ध उपकरणों में से एक है।
cmm

2
मूर्ख मत बनो, यह 2018 है tee। शक्तियों का उपयोग करें, यह है । Cmd को गंभीर स्क्रिप्टिंग के लिए कभी नहीं बनाया गया था - यही VBS के लिए था। पॉवरशेल नया गो-टू स्क्रिप्टिंग टूल है। दी, Cmd अभी भी बहुत शक्तिशाली है, लेकिन कमांड लाइन उपकरण बहुत कम हैं।
लुअन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.