'টি' এর উদ্দেশ্য কী?


90

আমার দেখা সমস্ত ব্যবহারগুলি teeএরকম ছিল:

 do_something | tee -a logfile

বা:

do_something_else | tee logfile

আপনি কি teeশেল পাইপ পুনর্নির্দেশগুলি দিয়ে একই কাজ করতে পারেন জানেন না তাদের জন্য উদ্ভাবন করা হয়েছে? যেমন:

do_something >> logfile

বা:

do_something_else > logfile

এটি ব্যবহারিকভাবে একই এবং এটি টাইপ করতে কম কীবোর্ড হিট লাগে। আমি কোন গোপন বৈশিষ্ট্যগুলি দেখছি না tee?


62
"... এবং স্ট্যান্ডার্ড আউটপুট এবং ফাইলগুলিতে লিখুন" ম্যান পৃষ্ঠার প্রথম লাইনে এটির কীভাবে উত্তর দেওয়া গেল না ? উত্তরগুলি আকর্ষণীয়, তবে কীভাবে পাইপগুলি কার্যকর সেগুলি সম্পর্কে ব্যাপকভাবে কথা বলার ফলে এই প্রশ্নটি কীভাবে খুব বেশি বিস্তৃত বলে মনে হয়, এবং সম্ভবত এটি বন্ধ করা উচিত ছিল rein
Xen2050

3
@ Xen2050 একটি প্রশ্নের বিস্তৃত উত্তরের জন্য দোষ দেওয়া যায় না। প্রশ্নটি অত্যন্ত সুনির্দিষ্ট, বর্তমান সর্বাধিক রেটেড উত্তর হিসাবে
জন বেন্টলে

1
@ জোনবেন্টলে প্রশ্নটি "পর্যাপ্ত উত্তর সনাক্তকরণের জন্য পর্যাপ্ত বিশদ সহ একটি নির্দিষ্ট সমস্যা" (ঘনিষ্ঠ সংলাপটি পড়ার সাথে) বলে মনে হচ্ছে না। এটি এর মতো শোনাচ্ছে: "যদি আপনার প্রশ্নের উত্তর একটি পুরো বইয়ের দ্বারা দেওয়া যেতে পারে বা এর অনেকগুলি বৈধ উত্তর (তবে কোনটি - যদি কোনওটি সঠিক হয় তবে তা নির্ধারণের কোনও উপায় নেই), তবে এটি সম্ভবত আমাদের ফর্ম্যাটটির পক্ষে খুব বিস্তৃত"। (উত্স: সহায়তা কেন্দ্র )
Xen2050

4
@ Xen2050 আমরা কি একই প্রশ্নটি পড়ছি? এটি আমার কাছে অত্যন্ত সুনির্দিষ্ট মনে হয় - টি এবং পাইপের মধ্যে পার্থক্য কী? দুটি বাক্য ব্যবহার করে এর যথাযথভাবে জবাব দেওয়া হয়েছে। একটি সম্পূর্ণ বই থেকে দূরে। কিছু উত্তর স্পর্শকাতর হয়ে যাওয়া বেছে নেওয়ার বিষয়টি প্রশ্নের ক্ষেত্রের সাথে কিছুই করার নেই।
জন বেন্টলে

@ জনবেন্টলি: আমরা কি একই প্রশ্নটি পড়ছি? আর মোগ ধরণের ধরণের ধরণটি মোটামুটি ভাল দৃষ্টি নিবদ্ধ করা প্রশ্নকে বোঝায় - tee এবং I / O পুনঃনির্দেশের মধ্যে পার্থক্য কী ?   এটি "শেল পাইপ পুনর্নির্দেশগুলি যেমন >এবং >>" বলেছে এটি তার পক্ষে কোনও বিষয় নয় এবং এটি অস্পষ্ট হিসাবে বন্ধ করার পক্ষে যুক্তি। তবে এটি আসলে একাধিক প্রশ্ন জিজ্ঞাসা করে: "এর উদ্দেশ্য কী tee?", " teeযারা শেল পাইপ পুনর্নির্দেশগুলি দিয়ে আপনি একই কাজ করতে পারেন জানেন না তাদের জন্য কী উদ্ভাবিত হয়?" এবং "আমি কোন গোপন বৈশিষ্ট্যগুলি দেখছি না tee?"। এই প্রশ্নগুলির মধ্যে কমপক্ষে দুটি খুব বিস্তৃত।
জি ম্যান

উত্তর:


242

আপনি কি দেখতে পাচ্ছি না যে do_something | tee -a logfileমধ্যে আউটপুট রাখে logfile এবং stdout- এ, যখন do_something >> logfileএটা বন্ধ রাখে শুধুমাত্র লগ ফাইল মধ্যে।

এর উদ্দেশ্য teeহ'ল একটি ইনপুট, একাধিক আউটপুট দৃশ্য উত্পাদন করা - ঠিক যেমন 'টি' ক্রসিংয়ের মতো।

সম্পাদনা

কীভাবে teeআরও বেশি দৃষ্টিনন্দন ব্যবহার সক্ষম করে তার চারপাশে মন্তব্য রয়েছে sudo। এই বিন্দুটি পাশে হল: cat, ddহয়তো বা ভাল buffer, ভাল পারফরম্যান্স সঙ্গে এই সম্ভাবনা প্রদান আপনি যদি একাধিক আউটপুট প্রয়োজন হবে না। teeএটি কীভাবে ডিজাইন করা হয়েছে তার জন্য ব্যবহার করুন , এটি "এছাড়াও করতে পারে" তার জন্য নয়


37
একাধিক আউটপুট কী। teeএমনকি একাধিক যুক্তিও নিতে পারে এবং একবারে অনেকগুলি ফাইলে লিখতে পারে।
কামিল ম্যাকিয়েরোভস্কি

20
আমি এটিকে টি পাইপ ফিটিং বলব , ক্রসিং নয় (কোনও রাস্তার মোড়ের মতো?) স্টাফগুলি এক উপায়ে আসে এবং উভয় পথেই বেরিয়ে যায়।
ব্যবহারকারী 20574

7
উদাহরণস্বরূপের catপরিবর্তে আমি কীভাবে সরলভাবে ব্যবহার করব ? কাজ করে না, কারণ পুনর্নির্দেশটি নন-সুডো শেল দ্বারা প্রক্রিয়া করা হয়। হিসাবে হিসাবে , কাজ করে, তবে প্রায়শই একটি অতিশক্তিযুক্ত সরঞ্জাম যা দুর্দান্ত ক্ষতি করতে সক্ষম হয়, বিশেষত অধীনে । যেমন , এটি রেডহ্যাট- বা উবুন্টু-ভিত্তিক ডিস্ট্রোসগুলির কোনওটিতে আমি ডিফল্টরূপে ইনস্টল করা নেই (বা ম্যাকোস) ...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
@ ইউজেনরেইক আমি 1: n এর মধ্যে সম্পর্কের সম্পর্কে: আপনার প্রাথমিক কার্যকারিতা হ'ল সম্পর্কে আপনার বক্তব্যটি পেয়েছি। যাইহোক, এই পরিস্থিতিতে বিল্টিন catবা /bin/catআমার পক্ষে কাজ করে না । catকোথা থেকে আসবে তা বিবেচ্য নয় - >এখনও শীর্ষ স্তর (নন-সুডো) শেল দ্বারা পরিচালিত হবে। এই পরিস্থিতিতে teeওভারের সুবিধা catহ'ল এটি আউটপুট ফাইলকে কমান্ড-লাইন প্যারাম হিসাবে পাস করার অনুমতি দেয় (এবং কোনও পুনর্নির্দেশ নয়)। dd, অবশ্যই একটি টেকসই বিকল্প যদিও আমি এখনও পক্ষপাতী চাই teeএই জন্য
ডিজিটাল ট্রমা

3
@ ইউজেনরেইক কি শেল রয়েছে catএবং teeবিল্টিনস হিসাবে রয়েছে? এবং sudoশেল বিল্টিনসের কোন সংস্করণটি চালাতে পারে?
wjandrea

118

Tee অকেজো নয়

আপনি হয়ত জানতেন? যদি না হয়, পড়ুন! অথবা আপনি কীভাবে এটি কাজ করে তা জানেন তবে এটি কেন বিদ্যমান তা নিশ্চিত না থাকলে ইউনিক্স দর্শনের সাথে এটি কীভাবে ফিট করে তা দেখতে শেষ পর্যন্ত যান।

কি হল উদ্দেশ্য tee?

এর সর্বাধিকতম সময়ে, এটি স্ট্যান্ডার্ড ইনপুটটিতে ডেটা নেয় এবং এটি স্ট্যান্ডার্ড আউটপুট এবং এক (বা আরও) ফাইলে লেখে। এটি একটি নদীর গভীরতানির্ণ টুকরোটির সাথে তুলনা করা হয়েছে যেভাবে এটি একটি ইনপুট দুটি আউটপুটগুলিতে বিভক্ত করে (এবং দুটি দিক)।

উদাহরণ

আসুন আপনার প্রথম উদাহরণটি নেওয়া যাক:

do_something | tee -a logfile

এটি আউটপুট নেয় do_somethingএবং এটি লগফাইলে সংযোজন করে, ব্যবহারকারীর কাছে প্রদর্শন করে। আসলে উইকিপিডিয়া পৃষ্ঠাতেtee এটি দ্বিতীয় উদাহরণ হিসাবে রয়েছে:

কমান্ড থেকে একটি বিদ্যমান ফাইলে আউটপুটটি দেখতে এবং যুক্ত করতে:

  lint program.c | tee -a program.lint

এটি কম্পিউটারে লিন্ট প্রোগ্রাম.c কমান্ডের স্ট্যান্ডার্ড আউটপুট প্রদর্শন করে এবং একই সাথে প্রোগ্রাম.লিন্ট ফাইলের শেষে এটির একটি অনুলিপি যুক্ত করে। প্রোগ্রাম.লিন্ট ফাইলটি না থাকলে এটি তৈরি হয়।

পরের উদাহরণটিতে আরও একটি ব্যবহার রয়েছে: অনুমতি বাড়ানো :

অনুমতি বাড়ানোর অনুমতি দেওয়ার জন্য:

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

এই উদাহরণটি দেখায় যে টি sudoকমান্ডের অন্তর্নিহিত সীমাবদ্ধতা বাইপাস করতে ব্যবহৃত হচ্ছে । sudoকোনও ফাইলে স্ট্যান্ডার্ড আউটপুট পাইপ করতে অক্ষম। এর স্ট্যান্ডার্ড আউট স্ট্রিমের মধ্যে ফেলে দিয়ে /dev/nullআমরা কনসোলে মিরর করা আউটপুটটিও দমন করি। উপরের কমান্ডটি সার্ভারের মূল অনুমোদনের তালিকায় ব্যবহারকারীর পাবলিক কী ইনস্টল করে বর্তমান ব্যবহারকারীকে ssh ওভার সার্ভারে রুট অ্যাক্সেস দেয় gives

অথবা সম্ভবত আপনি একটি কমান্ডের আউটপুট নিতে চান, এটি কোথাও লিখুন এবং এটি অন্য কমান্ডের ইনপুট হিসাবে ব্যবহার করতে চান?

আপনি কোনও কমান্ডের আউটপুট কোনও ফাইলে সংরক্ষণ করতে টি কমান্ড ব্যবহার করতে পারেন এবং একই আউটপুটটিকে অন্য কমান্ডের ইনপুট হিসাবে পুনর্নির্দেশ করতে পারেন।

নিম্নলিখিত কমান্ডটি ক্রন্টব এন্ট্রিগুলির ব্যাকআপ নেবে, এবং ক্রন্টব এন্ট্রিগুলি সেড কমান্ডের জন্য একটি ইনপুট হিসাবে পাস করবে যা প্রতিস্থাপনটি করবে। প্রতিস্থাপনের পরে, এটি একটি নতুন ক্রোন জব হিসাবে যুক্ত করা হবে।

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

( টি কমান্ড ব্যবহারের উদাহরণগুলিতে ক্রেডিট )

Tee ইউনিক্স দর্শনের সাথে কাজ করে:

এমন একটি প্রোগ্রাম লিখুন যা একটি কাজ করে এবং এটি ভাল করে। এক সাথে কাজ করার জন্য প্রোগ্রাম লিখুন। পাঠ্য স্ট্রিমগুলি পরিচালনা করতে প্রোগ্রামগুলি লিখুন, কারণ এটি সর্বজনীন ইন্টারফেস।

( ইউনিক্স দর্শনের মূল বিষয়গুলিতে ক্রেডিট )

tee এই সমস্ত ফিট করে:

  • এটি একটি কাজ করে: ইনপুটটির একটি অতিরিক্ত অনুলিপি তৈরি করে
  • এটি অন্যান্য প্রোগ্রামগুলির সাথে কাজ করে কারণ এটি আঠালো (বা আপনি যদি পছন্দ করেন তবে 'টি' নদীর গভীরতানির্ণয়) অন্য প্রোগ্রামগুলিকে উপরের উদাহরণগুলির মতো একসাথে কাজ করতে দেয়
  • এটি স্ট্যান্ডার্ড ইনপুটটিতে দেওয়া একটি পাঠ্য স্ট্রিমের কৌশল দ্বারা এটি করে

3
@Joe: sudo tee -aসম্ভবত একটি আরো সাম্প্রতিক নতুনত্ব (আমি প্রথমে উবুন্টু সহায়িকা / উইকিস বিশেষত উপাদান সেট করার জন্য দেখল /proc/sys, কারণ উবুন্টু স্যুইচ ছিল যখন আমি একটি সুইচ sudoভিত্তিক সিস্টেম (কিভাবে উবুন্টু ডিফল্ট দ্বারা কনফিগার করা হয়েছে) পরিবর্তে ব্যবহার 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 দিয়ে কোনও কমান্ড চালালে এটির স্টডআউটটি আপনার শেল প্রোগ্রামে ফিরে আসে এবং> এর সাথে আরও পুনর্নির্দেশগুলি শেলের অনুমতি নিয়ে চালানো হয়। আপনি যদি এলিভেটেড অনুমতি নিয়ে লিখতে চান তবে পাইপলাইনের উঁচু অংশটি আপনার লেখার মতো হওয়া দরকার। আপনি কীভাবে যাচ্ছেন তার উপর নির্ভর করে এটি করার অনেকগুলি উপায় রয়েছে। আপনি যদি সত্যিই> sudo bash -c "কমান্ড> আউটফিল" "এর মতো কিছু ব্যবহার করতে চান তবে কাজটি করবে।
পারকিন্স

হুবহু, @ পারকিনস। শেলটি পার্স করে >এবং সুডো এমনকি exec'ডি' পাওয়ার আগে পুনর্নির্দেশটি সেট আপ করে , তাই এটি অবশ্যই সুডোর সীমাবদ্ধতা নয় যে এটি কখনও দেখেনি এমন জিনিসগুলি পরিচালনা করে না। :) আমি সাধারণত এটিকে "সুডো ওয়ার্কফ্লো" বা কিছু অনুরূপ শব্দ হিসাবে উল্লেখ করার চেষ্টা করি যখন আমি এটি সুডো বর্ণনা না করেই ব্যাখ্যা করছি।
ড্যানিসাউয়ার

sudo tee -aআইএমএইচও হ'ল টি'র অপব্যবহার। ব্যবহারের 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বাশ স্ক্রিপ্টে ভুলে যাবেন না যা স্ক্রিপ্ট আউটপুট এবং stderr উভয়, স্টডআউট এবং ফাইলটি দ্বারা নির্দেশিত করতে দেয় $LOGFILE
রেক্সকোগিটানস

@rexkogitans 2> & 1 সেমিডি ব্যাচের সিনট্যাক্স নয়?
dmb

@ ডিএমবি: এটি স্ট্যান্ডআউট (= 1) হিসাবে একই জায়গায় "stderr (= 2) প্রেরণ করুন"
শেমার্স

@ রেক্সকোগিটানস এটি সত্যিই ন্যায্য প্রশ্ন ছিল, আমি সত্যিই জানতে পারি না যে আপনি এক দশক ধরে "উইন্ডোজ" ব্যবহার করেন নি। আমি 2>&1উইন্ডোতে আউটপুট এবং টিআরএসটি ফাইলগুলিতে ড্রপ ব্যবহার করি ।
ডিএমবি

1
@dmb আমি অভদ্র শোনার জন্য দুঃখিত এটি সবই স্মরণার্থীদের মন্তব্য সম্পর্কে। স্পষ্টতই, উইন্ডোজ এখানে ইউনিক্স-স্টাইল গ্রহণ করেছিল।
রেক্সকোটিটানস

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

@ জেডিবিপি দুঃখিত, সে কে সে বিষয়ে আমার কোনও ধারণা নেই। তিনি কি ইউটিলিটির মূল লেখক বা কিছু? ডেটা এবং শারীরিক তড়িৎ প্রবাহের প্রবাহকে প্রায়শই হাইড্রোলিক সিস্টেমের সাথে তুলনা করা হয় তবে আপনি সম্ভবত এটি জানেন। যাইহোক, আমি এটিকে সহজ সরল রাখতে এই স্টাইলটি বেছে নিয়েছি। আমি এটি পরিচিত রাখার জন্য এটি করতে যাচ্ছিলাম, তবে বাগানের বিভিন্ন ধরণের জিনিসপত্র সংযুক্ত করার জন্য ওয়াই-শেপ এবং / অথবা দৃশ্যত জটিল সংযুক্তি ইত্যাদির ঝোঁক বেশি থাকে যদিও এটি মূলত একই।
tjt263


18

না। আপনি কয়েকটি উদাহরণের একটি উল্লেখ করতে গিয়েছিলেন যেখানে আপনি প্রকৃতপক্ষে ফাইল >এবং >>অপারেটরগুলি ব্যবহার করে পুনর্নির্দেশ করতে পারেন ।

তবে টি আরও অনেক কিছু করতে পারে। যেহেতু আপনি এটিতে পাইপ রেখেছেন, তারপরে আপনি অন্য কোনও কিছুতে পাইপ করতে পারেন।

একটি ভাল উদাহরণ উইকিপিডিয়া পৃষ্ঠায় তালিকাভুক্ত :

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

মূলত, আপনি টিতে পাইপ করতে পারেন, তারপরে আপনি টি থেকে অন্য কোনও কিছুর দিকে পাইপ করতে পারেন। আপনি যা করতে চান তা যদি কোনও লগ ফাইল লিখতে হয় তবে হ্যাঁ, আপনার আসলে টিয়ের দরকার নেই।


17

teeঅকেজো থেকে দূরে। আমি এটি সর্বদা ব্যবহার করি এবং আনন্দিত যে এটি বিদ্যমান। আপনি যদি পাইপলাইনটি বিভক্ত করতে চান তবে এটি একটি খুব দরকারী সরঞ্জাম useful খুব সাধারণ উদাহরণটি হ'ল আপনার কাছে এমন কিছু ডিরেক্টরি রয়েছে $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
চিপনার

@ চেপনার আপনি প্রথম বাধা সম্পর্কে ঠিক বলেছেন তবে দ্বিতীয়টি সম্পর্কে আপনি সম্পূর্ণ ভুল। আমি আমার পাইপলাইনগুলি ক্রমে লিখতে পছন্দ করি, তাই ডানদিকে ইনপুটটি বোঝানো পাঠযোগ্যতার জন্য ভয়ঙ্কর এবং তা করা আমার পদ্ধতির থেকে সুস্পষ্টভাবে উদ্দেশ্যমূলকভাবে নিকৃষ্ট এবং আমার সম্পূর্ণ বিষয়গত পছন্দ নয়। catভালবাসা. catহচ্ছে জীবন.
ইউটিএফ-8

6
আপনি < file.tar.gz tee >(sha256sum) ...যদি পুনঃনির্দেশগুলির লেজিকাল ক্রম সম্পর্কে উদ্বিগ্ন হন তবে আপনি লিখতেও পারেন। এটি কেবল কোনও একক ফাইলকে খাওয়ানোর জন্য সম্পূর্ণ পৃথক প্রক্রিয়ার প্রয়োজন নেই এই সত্যটি পরিবর্তন করে না tee
চিপনার

1
@ চেপনার শীতল, আপনাকে ধন্যবাদ! আজ কিছু শিখেছি। :)
ইউটিএফ-8

1
শুরু করার ব্যয় catতুলনামূলকভাবে কম low আপনার অতিরিক্ত একটি ফাইলের প্রস্তাবিত উদাহরণের জন্য অতিরিক্ত 100 জিআইবি রাইটিং + রিড সিস্টেম কলগুলির ব্যয় অবশ্যই আপনার অতিরিক্ত সিপিইউ সময় এবং মেমরি ব্যান্ডউইথকে নষ্ট করে। মনে রাখবেন যে মেমরি ব্যান্ডউইথ সমস্ত কোর জুড়ে একটি শেয়ার্ড রিসোর্স, সেই অনুলিপি থেকে এল 3 ক্যাশের অতিরিক্ত দূষণের কথা উল্লেখ না করে। স্পেকটার + মেল্টডাউন প্রশমন সক্ষম করার সাথে একটি x86 এ, সিস্টেম কলগুলি তার আগের চেয়ে বেশি ব্যয়বহুল। আপনি সেই অনুলিপিটির সময় পরিমাপযোগ্য পরিমাণে অতিরিক্ত সিপিইউ সময় ব্যবহার করছেন। এছাড়াও >(cat > foo)চেয়ে বুঝতে সহজ নয় foo, আইএমও।
পিটার কর্ডেস

12

@ বার্তিবের উত্তরে নিটপিক বলেছেন যে এই উদাহরণটি দেখায় যে টি সুডু কমান্ডের অন্তর্নিহিত সীমাবদ্ধতা বাইপাস করতে ব্যবহৃত হচ্ছে। sudo কোনও ফাইলে স্ট্যান্ডার্ড আউটপুট পাইপ করতে অক্ষম।

কোনও অন্তর্নিহিত সীমাবদ্ধতা নেই, কেবল কমান্ডটি কীভাবে প্রক্রিয়াজাত করা হয় সে সম্পর্কে একটি ভুল ধারণা।

উদাহরণ:

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

বর্তমান শেল কমান্ড লাইন parses। এটি আউটপুট পুনঃনির্দেশের সন্ধান করে এবং এটি সম্পাদন করে। তারপরে এটি কমান্ডটি কার্যকর করে, যা হ'ল 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? (কী ঘটছে তা আরও তাত্ক্ষণিকভাবে স্পষ্ট)
এট্টি

@ অট্টি touchফাইলগুলি ইতিমধ্যে উপস্থিত থাকলে তাদের কেটে যাবে না তবে কেবলমাত্র তাদের টাইমস্ট্যাম্পগুলি আপডেট করবে এবং তাদের সামগ্রী যেমন আছে তেমন ছেড়ে দেবে; তবে teeসেগুলি কেটে ফেলবে। এছাড়াও, করা rm+ (হার্ডলিঙ্ক এবং প্রতীকগুলি সম্পর্কে ভাবেন) এর touchচেয়ে পৃথকtee
মতিজা নালিস

তাহলে কেন হবে না truncate -s 0? :-)
Attié

1

কল্পনা করুন, আপনি কোনও লগ ফাইলে একটি কমান্ডের আউটপুট লিখতে চান এবং প্রবন্ধকে প্রিন্ট করতে চান। আপনার যখন একই সময়ে এটি করা দরকার তখন আপনার প্রয়োজন tee

ব্যবহারের ক্ষেত্রে হ'ল বিল্ড স্ক্রিপ্টগুলি রয়েছে যা পুরো বিল্ডটি স্ট্ডআউটে লিখবে (যেমন জেনকিন্সের জন্য) তবে গুরুত্বপূর্ণ জিনিস একই সাথে আলাদা লগ ফাইলে (সংক্ষিপ্ত ইমেলের জন্য)।

teeউইন্ডোতে যখন স্ক্রিপ্ট করতে হবে তখন আপনি সত্যিই অনুপস্থিত শুরু করবেন । নেই teeএবং তা সত্যিই বিরক্তিকর।


এটি তৈরি করা তুচ্ছ নয়?
অরবিতের

ব্যাচ / সেন্টিমিটার দিয়ে এটি সম্ভব নয় কারণ আপনি সহজেই কোনও আদেশ থেকে আউটপুটের স্ট্রিমটি বিভক্ত করতে পারবেন না।
domih

ডান তবে ত্রি-লাইনের সি ++ প্রোগ্রামের মতো ...
অরবিট-এ লাইটনেস রেস

1
উইন্ডোজ আনক্সিটিল বিতরণে অনেকগুলি ইউনিক্স কমান্ড লাইন সরঞ্জাম রয়েছে যা কিছু বিতরণের মতো নয়, আপনার উইন্ডোজ নির্বাহের পরিবেশকে দূষিত করে না। বৃহত্তম সীমাবদ্ধতা হ'ল "গ্লোব" বিং, যা উইন্ডোজের চেয়ে ইউনিক্স / লিনাক্সে আলাদাভাবে কাজ করে। "টি" উপলব্ধ সরঞ্জামগুলির মধ্যে একটি।
সেমি

2
বোকা হয়ে উঠবেন না, এটি 2018। পাওয়ারশেল ব্যবহার করুন, এটি রয়েছে tee। সিএমডি কখনই গুরুতর স্ক্রিপ্টিংয়ের উদ্দেশ্যে নয় - ভিবিএসের জন্য এটি ছিল। পাওয়ারশেল হ'ল স্ক্রিপ্টিং-এর নতুন সরঞ্জাম। মঞ্জুর, সিএমডি এখনও বেশ শক্তিশালী তবে কমান্ড-লাইন সরঞ্জামগুলি খুব কম।
লুয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.