প্রযুক্তিগত দৃষ্টিকোণ থেকে, "/dev/null" একটি ভার্চুয়াল ডিভাইস ফাইল। প্রোগ্রামের দৃষ্টিকোণ থেকে, এগুলো আসল ফাইল처럼 বিবেচিত হয়। ইউটিলিটিগুলি এই ধরনের সোর্স থেকে ডেটা অনুরোধ করতে পারে, এবং অপারেটিং সিস্টেম তাদের ডেটা ফিড করে। কিন্তু, ডিস্ক থেকে পড়ার বদলে, অপারেটিং সিস্টেম এই ডেটা ডাইনামিক্যালি জেনারেট করে। এর একটি উদাহরণ হল "/dev/zero"।
এই কেসে, কিন্তু, আপনি একটি ডিভাইস ফাইলে লিখবেন। আপনি "/dev/null"-এ যা লিখেন তা বাতিল হয়ে যায়, ভুলে যায়, শূন্যতায় ফেলে দেওয়া হয়। এটি কেন উপকারী সেটি বুঝতে, আপনাকে প্রথমে লিনাক্স বা *nix টাইপ অপারেটিং সিস্টেমে স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড এরর সম্পর্কে বেসিক ধারণা থাকতে হবে।
stdout এবং stderr
একটি কমান্ড-লাইন ইউটিলিটি দুটি ধরনের আউটপুট জেনারেট করতে পারে। স্ট্যান্ডার্ড আউটপুট stdout-এ পাঠানো হয়। এররগুলো stderr-এ পাঠানো হয়।
ডিফল্টরূপে, stdout এবং stderr আপনার টার্মিনাল উইন্ডো (বা কনসোল) এর সাথে সংযুক্ত থাকে। এর মানে stdout এবং stderr-এ পাঠানো যেকোনো কিছু সাধারণত আপনার স্ক্রিনে প্রদর্শিত হয়। কিন্তু শেল রিডাইরেকশনের মাধ্যমে, আপনি এই আচরণ পরিবর্তন করতে পারেন। উদাহরণস্বরূপ, আপনি stdout-কে একটি ফাইলে রিডাইরেক্ট করতে পারেন। এইভাবে, স্ক্রিনে আউটপুট প্রদর্শনের বদলে, এটি একটি ফাইলে সংরক্ষিত হবে যাতে আপনি পরে পড়তে পারেন – অথবা আপনি stdout-কে একটি ফিজিক্যাল ডিভাইসে, মানে একটি ডিজিটাল LED বা LCD ডিসপ্লে-এ রিডাইরেক্ট করতে পারেন।
পাইপ এবং রিডাইরেকশন সম্পর্কে একটি পূর্ণ artilce উপলব্ধ যদি আপনি আরও জানতে চান।
2>দিয়ে আপনি স্ট্যান্ডার্ড এরর মেসেজ রিডাইরেক্ট করেন। উদাহরণ:2>/dev/nullবা2>/home/user/error.log।1>দিয়ে আপনি স্ট্যান্ডার্ড আউটপুট রিডাইরেক্ট করেন।&>দিয়ে আপনি স্ট্যান্ডার্ড এরর এবং স্ট্যান্ডার্ড আউটপুট উভয়েই রিডাইরেক্ট করেন।
/dev/null ব্যবহার করে অনাবশ্যক আউটপুট সরিয়ে দিন
যেহেতু দুটি ধরনের আউটপুট রয়েছে, স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড এরর, প্রথম ইউজ কেস হচ্ছে একটাই ফিল্টার আউট করা। এটি একটি প্র্যাক্টিক্যাল উদাহরণ দিয়ে বোঝা সহজ। ধরে নিন, আপনি "/sys"-এ একটি স্ট্রিং খুঁজছেন যাতে পাওয়ার সেটিংস রেফার করা ফাইলগুলো খুঁজে পাওয়া যায়।
grep -r power /sys/
অনেক ফাইল থাকবে যা একটি সাধারণ, নন-রুট ইউজার পড়তে পারবে না। এর ফলে অনেক "Permission denied" এরর আসবে।
এইগুলা আউটপুট গুলোকে গুলায়ে ফেলে এবং আপনি যে রেজাল্টগুলো খুঁজছেন সেগুলো স্পট করা কঠিন করে তোলে। যেহেতু "Permission denied" এররগুলো stderr-এর অংশ, আপনি সেগুলাকে "/dev/null"-এ রিডাইরেক্ট করতে পারেন।
grep -r power /sys/ 2>/dev/null
আপনি দেখতে পাচ্ছেন, এটি পড়া অনেক সহজ।
অন্য কেসে, বিপরীত কাজ করা উপকারী হতে পারে: স্ট্যান্ডার্ড আউটপুট ফিল্টার আউট করা যাতে আপনি শুধু এরর দেখতে পান।
ping google.com 1>/dev/null
উপরের স্ক্রিনশটে দেখানো হয়েছে যে, রিডাইরেক্ট ছাড়া ping গন্তব্য মেশিনে পৌঁছালে এর স্বাভাবিক আউটপুট প্রদর্শন করে। দ্বিতীয় কমান্ডে, নেটওয়ার্ক অনলাইন থাকলে কিছুই প্রদর্শিত হয় না, কিন্তু যדה এটি ডিসকানেক্ট হয়, শুধু এরর মেসেজ প্রদর্শিত হয়।
আপনি stdout এবং stderr উভয়কেই দুটি আলাদা লোকেশনে রিডাইরেক্ট করতে পারেন।
ping google.com 1>/dev/null 2>error.log
এই কেসে, stdout মেসেজ গুলো হয়তো প্রদর্শিত হবে না, এবং এরর মেসেজ গুলো "error.log" ফাইলে সংরক্ষিত হবে।
সকল আউটপুট /dev/null-এ রিডাইরেক্ট করুন
কभी কখন সব আউটপুট বাতিল করা উপকারী হয়। এটি করার দুটি উপায় রয়েছে।
grep -r power /sys/ >/dev/null 2>&1
স্ট্রিং >/dev/null মানে "stdout /dev/null-এ পাঠাও", এবং দ্বিতীয় অংশ, 2>&1, মানে stderr stdout-এ পাঠাও। এই কেসে আপনাকে stdoutকে "&1" হিসেবে রেফার করতে হবে সাদা "1" না। "2>1" লিখলে শুধু stdout "1" নামের একটি ফাইলে রিডাইরেক্ট হবে।
এখানে গুরুত্বপূর্ণ বিষয় হচ্ছে অর্ডারটি মেনে চলা। আপনি যদি রিডাইরেক্ট প্যারামিটারগুলো উল্টা দেন যেন:
grep -r power /sys/ 2>&1 >/dev/null
তবে এটি উদ্দেশ्यानুসারে কাজ করবে না। এর কারণ হচ্ছে, যতক্ষণ 2>&1 ইন্টারপ্রেট হয়, stderr stdout-এ পাঠানো হয় এবং স্ক্রিনে প্রদর্শিত হয়। এরপর, stdout দমন করা হয় যখন "/dev/null"-এ পাঠানো হয়। চূড়ান্ত ফলাফল হচ্ছে আপনি এরর স্ক্রিনে দেখবেন সব আউটপুট সাপ্রেস করার বদলে। আপনি যদি সঠিক অর্ডার মনে রাখতে না পারেন, তবে একটি সহজ রিডাইরেক্ট রয়েছে যা টাইপ করা অনেক সহজ:
grep -r power /sys/ &>/dev/null
এই কেসে, &>/dev/null সমতুল্য "stdout এবং stderr উভয়কেই এই লোকেশনে রিডাইরেক্ট করো" বলার।
অন্যান্য উদাহরণ যেখানে /dev/null-এ রিডাইরেক্ট করা উপকারী
মান লিন, আপনি চান দেখতে আপনার ডিস্ক কত দ্রুত সিকুয়েনশিয়াল ডেটা পড়তে পারে। টেস্টটি অত্যধিক সঠিক নয় কিন্তু পর্যাপ্ত সঠিক। আপনি dd ব্যবহার করতে পারেন, কিন্তু dd হয় stdout-এ আউটপুট দেয় বা একটি ফাইলে লিখতে নির্দেশ করা যেতে পারে। of=/dev/null দিয়ে আপনি dd কে এই ভার্চুয়াল ফাইলে লিখতে বলতে পারেন। আপনাকে এখানে শেল রিডাইরেকশন ব্যবহার করার ضرورتেও নেই। if= ইনপুট ফাইলের লোকেশন নির্দিষ্ট করে যেটি পড়া হবে; of= আউটপুট ফাইলের নাম নির্দিষ্ট করে, কোথায় লিখবে।
dd if=debian-disk.qcow2 of=/dev/null status=progress bs=1M iflag=direct
কিছু সিনেরিওতে, আপনি চাইতে পারেন একটি সার্ভার থেকে কত দ্রুত ডাউনলোড করা যায় তা দেখুন। কিন্তু আপনি অপ্রয়োজনীয়ভাবে আপনার ডিস্কে লিখতে চান না। সহজেই, একটি রেগুলার ফাইলে না লিখে, "/dev/null"-এ লিখুন।
wget -O /dev/null https://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso
উপসংহার
আশা করি এই আর্টিকেলের উদাহরণগুলো আপনাকে "/dev/null"-এর নিজস্ব সৃজনশীল ব্যবহার খুঁজে বের করার অনুপ্রেরণা দেবে।
এই বিশেষ ডিভাইস ফাইলের জন্য আপনার কি কোনো আকর্ষণীয় ইউজ-কেস জানেন? নিচে কমেন্ট করে জ্ঞান বান্টুন!