আপনি যদি কখনো আপনার লিনাক্স শেলে পাইপ এবং রিডাইরেকশন ব্যবহার করেন, তবে সম্ভবত আপনি কখনও কখনও tee ইউটিলিটিও ব্যবহার করার প্রয়োজন পড়বেন।
tee কী করে?
lsকমান্ড আপনার করেন্ট ডিরেক্টরির কন্টেন্টস দেখাবে। অন্য কথায়, এটি stdout (স্ট্যান্ডার্ড আউটপুট)-এ কন্টেন্টস প্রদর্শন করে, যা সাধারণত আপনার স্ক্রিন, বা আরও স্পষ্ট বললে, আপনার ভার্চুয়াল টার্মিনাল ডিসপ্লে।
ls > file123কমান্ড আপনার স্ক্রিনে কিছুই দেখাবে না। এটার কারণ
> সাইন সকল আউটপুট একটি ফাইলে রিডাইরেক্ট করে স্ক্রিনে stdout-এ প্রদর্শন করার বদলে। file123 এখন আগে যা স্ক্রিনে দেখা যেত সেটি দিয়ে পূর্ণ হবে।
আপনার ডিরেক্টরির কন্টেন্টস স্ক্রিনে দেখাতে এবং একসাথে একটি ফাইলে লিখতে হলে আপনাকে দুটি কমান্ড লাগবে। tee দিয়ে আপনি এই দুটি কাজ একসাথে করতে পারেন।
ls | tee file123
আপনি যদি একই কমান্ড দুবার চালাতে পারেন তবে tee কেন ব্যবহার করবেন?
উপরের উদাহরণে, আপনি স্পষ্টভাবেই tee দরকার নেই যদি আপনি ls নরমালি এক্সিকিউট করেন এবং তারপর আবার এক্সিকিউট করে আউটপুট ফাইলে রিডাইরেক্ট করেন। কিন্তু, আপনি এমন পরিস্থিতিয়ের সম্মুখীন হবেন যেখানে আউটপुट ইউনিক হবে। একটি সিনেরিও কল্পনা করুন যেখানে আপনি একটি সমস্যা ডায়াগনোজ করার চেষ্টা করছেন। আপনি diagnose | tee error.log চালান। আপনি যে এররগুলো পাবেন সেগুলো ইউনিক হতে পারে। আপনি সেগুলো স্ক্রিনে দেখতে চান যাতে টেস্ট করার সময় কী হচ্ছে সেটি দেখতে পান। কিন্তু আপনি সেই এররগুলো একটি ফাইলে সংরক্ষিতও রাখতে চান, যাতে পরে রিভিউ করতে পারেন বা আউটপুট একটি ডিসকশন ফোরামে পেস্ট করে লোকজनों से প্রশ্ন করতে পারেন।
এক আর পরিস্থিতি, যা часто দেখা যায়, যখন আপনাকে tee দরকার পড়তে পারে: আপনি একটি কমান্ডের আউটপুট একটি এমন লোকেশনে লিখতে চান যেখানে শুধু রুট ইউজার পড়তে বা লিখতে পারে। এটি কাজ করবে না।
/sbin/blkid > /root/somefile
তখন, আপনি চিন্তা করতে পারেন, "খুব সহজ, sudo ব্যবহার করুন!" এবং আপনি বিস্মিত হবেন যে এটিও কাজ করে না:
sudo blkid > /root/somefile
এটি কারণ sudo blkid এক্সিকিউট হওয়ার পর, আপনি এখনও আপনার রেগুলার, নন-রুট ইউজার হিসেবে লগড ইন থাকছেন। এবং আপনার শেল (সাধারণত bash), আপনার রেগুলার ইউজার ক্রেডেনশিয়াল দিয়ে /root/somefile-এ লিখতে চেষ্টা করে। এটি সমাধান করতে, আপনি tee ব্যবহার করতে পারেন:
/sbin/blkid | sudo tee /root/somefile
টেক্সট অ্যাপেন্ড করা এবং এরর রিডাইরেক্ট করা
tee একটি উপকারী কিন্তু সিম্পল কমান্ড; একটি বেসিক command | tee somefile অধিকাংশ সময় যথেষ্ট। তবে, দুটি সিনেরিও আছে যা আপনি সম্মুখীন হতে পারেন যেগুলোর জন্য এই টিপসগুলো দরকার।
প্রথম জিনিস জানতে হচ্ছে tee, ডিফল্টরূপে, সবসময় একটি ফাইল ওভাররাইট করে। আপনি যদি চালান
ls | tee somefile
তারপর
ls /tmp | tee somefile
দ্বিতীয় কমান্ড somefile-এর কন্টেন্টস ওভাররাইট করবে, এবং আপনি শুধু শেষ এক্সিকিউট করা কমান্ডের কন্টেন্টস দেখবেন। এই আচরণ পরিবর্তন করতে, আপনি tee-কে টেক্সট অ্যাপেন্ড করতে বলতে পারেন ওভাররাইট করার বদলে। এটি করতে, শুধু -a কমান্ড স্যুইচ ব্যবহার করুন।
ls | tee -a somefile
দ্বিতীয় জিনিস জানতে হচ্ছে সব আউটপুট একই নয়। এরর মেসেজ ভিন্নভাবে ট리트 করা হয়, এবং যদিও সেগুলো স্ক্রিনে দেখায়, সেগুলো stdout ধরা হয় না, তাই tee দ্বারা ক্যাচ করা হবে না। (সেগুলো stderr ধরা হয়।) grep-এ একটি উদাহরণ।
grep -r L2TP /etc | tee somefile
এটি নিচের ছবির মতো কিছু দেখাবে।
"Permission denied" মেসেজগুলো stderr-এ লেখা হয়। একমাত্র জিনিস stdout-এ লেখা হয়েছে হাইলাইট করা টেক্সট। সেটিই কারণ আপনি লক্ষ্য করবেন "somefile"-এর কন্টেন্টস নিচের ছবিতে যা দেখানো হয়েছে।
এই কেসে, যেখানে grep টেক্সট সার্চ করতে ব্যবহৃত হচ্ছে, এরর মেসেজ ফাইলে রিডাইরেক্ট না হওয়াটা উপকারী। সেগুলো শুধু ফাইলটিকে অপ্রয়োজনীয় গার্বেজ দিয়ে পূর্ণ করবে। আপনি শুধু ফাউন্ড রেজাল্ট দেখতে চান। কিন্তু আপনি যখন এরর মেসেজ দরকার, 2>&1 ব্যবহার করুন, যা stderr stdout-এ রিডাইরেক্ট করে।
grep -r L2TP /etc 2>&1 | tee somefile
এই কমান্ডদিয়ে আপনি লক্ষ্য করবেন somefile এখন এরর মেসেজও কন্টেইন করছে।
উপসংহার
আশা করি, এই টিউটোরিয়াল tee কমান্ডের সর্বোচ্চ ব্যবহার পাওয়ার জন্য আপনার যা যা দরকার সেটি কভার করেছে। কিন্তু আপনি যদি tee-এ আটকে যান এমন কোনো পরিস্থিতি মোকাবেলা করেন, তবে নিচে কমেন্ট করুন, আমরা হয়তো সাহায্য করতে পারি।