লিনাক্স/ব্যাশ শেলে তিনটি ডেটা ストリম আছে যা আপনি কমান্ড এক্সিকিউট করার সময় ব্যবহার করতে পারেন - stdin, stdout, এবং stderr। এখানে কিভাবে ব্যবহার করবেন সেটা দেখানো হয়েছে।
stdin, stdout, stderr কনসোলে টেক্সট ডিসপ্লে করার অনুমতি দেয়, এবং প্রতিটি স্ট্রিম থেকে আউটপুট হওয়া ডেটা অন্যান্য প্রোগ্রামে ডাইরেক্ট করা যায়।
এগুলোকে Standard Streams বলা হয়।
stdin (Standard Input) কী?
টেক্সট ইনপুট স্ট্রিম।
অ্যাপ্লিকেশন stdin দিয়ে টেক্সট ইনপুট হিসেবে গ্রহণ করতে পারে।
stdout (Standard Output) কী?
একটি প্রোগ্রামের টেক্সট আউটপুট স্ট্রিম।
অ্যাপ্লিকেশন stdout দিয়ে অন্য প্রোগ্রামে (বা কনসোলে ভিউইং-এর জন্য) ডেটা পাঠায়।
stderr (Standard Error) কী?
একটি প্রোগ্রামের টেক্সট এরর আউটপুট স্ট্রিম।
যদি একটি প্রোগ্রাম এরর এনকাউন্টার করে, সেটি এরর সংক্রান্ত ডেটা stderr স্ট্রিম দিয়ে আউটপুট করবে।
...হ্যাঁ, কিন্তু আসলে এটা মানে কী?
একটি কম্পিউটার প্রোগ্রাম ইনপুট এবং আউটপুট ডেটা দিয়ে কাজ করে - উদাহরণস্বরূপ, একটি প্রোগ্রাম একটি গাণিতিক সমীকরণ গ্রহণ করতে পারে এবং সমাধান প্রদান করতে পারে।
আপনাকে সমীকরণটিকে প্রোগ্রামের ভিতরে IN করার পদ্ধতি এবং প্রোগ্রাম থেকে উত্তর বের করার OUT পদ্ধতি দরকার। আপনি জানতে চান সমীকরণটি সমাধানযোগ্য কিনা, তাই আপনি ERROR দেখতে চান, অন্যান্য OUTPUT থেকে আলাদা।
এটাই stdin, stdout, এবং stderr।
যেহেতু সব কিছু একইভাবে কাজ করলে জীবন সহজ হয়, এই ইনপুট, আউটপুট, এবং এরর স্ট্রিমগুলো স্ট্যান্ডার্ডাইজড হয়েছে যাতে কমান্ড লাইনের জন্য বিল্ট অ্যাপ্লিকেশনগুলো একইভাবে বিহেভ করে।
তাই, Standard Streams। প্রতিটি স্ট্রিমের ০-৩ পর্যন্ত একটি न्यুমেরিক্যাল আইডেন্টিফায়ার আছে:
| 0 | stdin |
| 1 | stdout |
| 2 | stderr |
Bash/Shell-এ stdin, stdout, stderr থেকে রিডাইরেক্ট/পাইপিং
আপনি লিনাক্স শেলে টাইপ করছেন সেটা একটি টেক্সট স্ট্রিম - আপনি টাইপ করেন, এবং টেক্সট স্ট্রিম কনসোল ইনপুটে ফিড হয়।
একটি অ্যাপ্লিকেশন রান হয়, এবং সেটা থেকে আউটপুট টেক্সট ডেটা কনসোলে ফিড হয় ডিসপ্লেশনের জন্য যাতে আপনি পড়তে পারেন।
এটাই ডিফল্ট বিহেভিয়ার কনসোলে কাজ করার সময়, কিন্তু এটা চেঞ্জ করা যায়। স্ট্রিমগুলো রিডাইরেক্ট করা যায় - উদাহরণস্বরূপ, প্রোগ্রামের আউটপুট সরাসরি ফাইলে স্ট্রিম করা যায় কনসোলে ডিসপ্লেশনের বদলে।
এক প্রোগ্রামের আউটপুট অন্য প্রোগ্রামের ইনপুটে সরাসরি রিডাইরেক্ট করা যায়।
রিডাইরেকশন এবং পাইপিং-এর কিছু বেসিক উদাহরণ নিচে:
রিডাইরেকশন
সাধারণত echo কমান্ড টেক্সট কনসোলে প্রিন্ট করে:
echo "hello there!"
echo প্রোগ্রামের stdout এর ডিফল্ট পথ আপনার স্ক্রিনে ডিসপ্লে হওয়া।
রিডাইরেকশন দিয়ে আপনি সেটা কোথাও অন্য জায়গায় পাঠাতে পারেন। এখানে এটি একটি ফাইলে পাঠানো হয়েছে:
echo "hello there!" > test.txt
test.txt নামে একটি ফাইল তৈরি হবে যাতে টেক্সট "hello there!" থাকবে (সাবধান, ফাইল যদি ইতিমধ্যে এক্সিস্ট করে, ওভাররাইট হয়ে যাবে)।
আপনি >> ব্যবহার করে ফাইল অ্যাপেন্ড করতে পারেন >-র বদলে
এরপর, < ব্যবহার করে stdin রিডাইরেক্ট করুন
cat < test.txt
cat কমান্ড test.txt-এর কন্টেন্ট তার stdin স্ট্রিমে পড়ে এবং তারপর cat কমান্ডের কাজ করে - stdout-এ সাপ্লাইড ডেটা প্রিন্ট করে, যা ডিফল্ট কনসোল ভিউইং। তাই এটি সিম্পলি hello there! কনসোলে আউটপুট করবে।
ফাইলের ডেটা cat কমান্ডের stdin-এ ডাইরেক্ট করা হয়েছে - এটি রিডাইরেক্টেড।
এটি একটু চিটিং, cat কমান্ড ফাইলনেম প্যারামিটার হিসেবে পাস করলে बिना পাইপিং-এ চেষ্টা করে পড়ে, কিন্তু এই উদাহরণের জন্য এটি সিম্পলেস্ট কমান্ড।
আপনি একই কমান্ডে stdin এবং stdout উভয় রিডাইরেক্ট করতে পারেন:
cat < test.txt > output.txt
stdin রিডাইরেক্ট হচ্ছে, test.txt cat প্রোগ্রামে পড়া হচ্ছে, এবং cat প্রোগ্রামের stdout একটি ফাইলে ডাইরেক্ট হচ্ছে output.txt নামে।
আবার চিটিং, কারণ এটি আসলে cat কমান্ড দিয়ে ফাইল কপি করছে, কিন্তু অন্য কমান্ড এক্সপ্লেইন ছাড়া এটি একটি সিম্পল উদাহরণ।
শেষে, আপনি stderr স্ট্রিম রিডাইরেক্ট করতে পারেন এর ইউনিক স্ট্রিম নম্বর স্পেসিফাই করে (যেহেতু stdout ডিফল্ট, সেটা স্পেসিফাই করতে হয় না):
cat nofile.txt 2> error.txt
stderr নম্বর 2-এ আইডেন্টিফাইড - যদি cat এরর জেনারেট করে, সেটা এই স্ট্রিম দিয়ে পাঠানো হবে এবং error.txt ফাইলে যাবে।
উপরের উদাহরণ error.txt নামে একটি ফাইল তৈরি করবে যাতে টেক্সট থাকবে:
cat: nofile.txt: No such file or directory
...কারণ cat কমান্ড nofile.txt ফাইলটি খুঁজে পায়নি।
সিমালটেনিয়াস রিডাইরেকশন
উপরের উদাহরণে, stderr স্ট্রিম এর নিউমেরিক আইডেন্টিফায়ার দিয়ে আইডেন্টিফাই করা হয়েছে - এর মানে আপনি একই কমান্ডে stdout এবং stderr উভয় রিডাইরেক্ট করতে পারেন স্পেসিফাই করে কোনটি রিডাইরেক্ট করতে চান:
echo "hello there! 1>test.txt 2>error.txt
উপরে, stdout যাচ্ছে test.txt-এ, এবং stderr যাচ্ছে error.txt-এ।
পাইপিং
পাইপিং রিডাইরেকশনের মতোই, কিন্তু এটি শুধু stdin এবং stdout-এর সাথে ডিল করে, এররগুলো ইগনোর করে।
echo "hello there!" | cat
এখানে, পাইপ (|) echo কমান্ডের stdout-কে cat কমান্ডের stdin-এ পাইপ (রিডাইরেক্ট) করে।
উপসংহার
কমান্ডলাইন অ্যাপ্লিকেশন দিয়ে কাজ করা প্রথমে অনইনটুইটিভ লাগতে পারে, কিন্তু টাস্ক অটোমেট করার জন্য এগুলো পাওয়ারফুল টুল। stdin, stdout, এবং stderr - স্ট্যান্ডার্ড স্ট্রিমস এই ফ্লেক্সিবিলিটির কোর্নারস্টোন - আপনি কমান্ড চেইন করে কমপ্লেক্স ওয়ার্কফ্লো বানাতে পারেন যেকোনো টাস্ক হ্যান্ডেল করতে।