কমান্ড-লাইন ইন্টারফেসের জগতে প্রোগ্রামগুলো প্রায়ই তিনটি স্ট্যান্ডার্ড ডেটা স্ট্রিমের সাথে কাজ করে:
stdin): যেখান থেকে একটি প্রোগ্রাম তার ইনপুট পায় (সাধারণত কীবোর্ড থেকে)।stdout): যেখানে একটি প্রোগ্রাম তার স্বাভাবিক আউটপুট পাঠায় (সাধারণত টার্মিনাল স্ক্রিনে)।stderr): যেখানে একটি প্রোগ্রাম এরর মেসেজ পাঠায় (সাধারণত টার্মিনাল স্ক্রিনে)।মনে করুন, এই স্ট্রিমগুলোর সাথে আমরা পাইপলাইন ও কমান্ড লিস্ট অধ্যায়ে পরিচয় করিয়েছিলাম।
পাইপলাইনকে রিডাইরেকশনের একটি রূপ হিসেবে ধরা যেতে পারে: একটি প্রোগ্রামের স্ট্যান্ডার্ড আউটপুট সরাসরি আরেকটি প্রোগ্রামের স্ট্যান্ডার্ড ইনপুটে পাঠানো হয়। পাইপলাইন নিয়ে আমরা ইতিমধ্যে আলোচনা করেছি। এই কনসেপ্টে ফাইল থেকে এবং ফাইলে রিডাইরেক্ট করা নিয়ে আলোচনা করা হবে।
শেল রিডাইরেকশন একটি শক্তিশালী পদ্ধতি, যা দিয়ে আপনি এই স্ট্রিমগুলোর গন্তব্য বদলাতে পারেন। প্রোগ্রাম কীবোর্ড থেকে পড়বে বা স্ক্রিনে লিখবে, তার বদলে আপনি একটি ফাইল থেকে ইনপুট রিডাইরেক্ট করতে পারেন বা আউটপুট একটি ফাইলে পাঠাতে পারেন। এতে প্রোগ্রামগুলো কীভাবে ডেটার সাথে কাজ করে, তার উপর যথেষ্ট নমনীয়তা ও নিয়ন্ত্রণ পাওয়া যায়।
সবচেয়ে কমন রিডাইরেকশন অপারেটরগুলো এবং তারা কী করে, তা এখানে দেওয়া হলো:
> (আউটপুট রিডাইরেকশন)উদ্দেশ্য: একটি কমান্ডের স্ট্যান্ডার্ড আউটপুট (stdout) একটি ফাইলে রিডাইরেক্ট করা।
আচরণ:
উদাহরণ:
# Sends the output of 'ls -l' to 'file_listing.txt'
ls -l > file_listing.txt
কমান্ড চালানোর আগেই রিডাইরেকশন করা হয়। এর মানে হলো, যে ফাইল থেকে পড়তে হবে, ঠিক সেই ফাইলেই আপনি রিডাইরেক্ট করতে পারবেন না।
date > date.txt # populate the file with the current date
cat date.txt > date.txt # 'date.txt' is now empty!
উপরের উদাহরণের দ্বিতীয় কমান্ডে,
>> (অ্যাপেন্ড আউটপুট রিডাইরেকশন)উদ্দেশ্য: একটি কমান্ডের স্ট্যান্ডার্ড আউটপুট (stdout) একটি ফাইলের শেষে যোগ করা।
আচরণ:
উদাহরণ:
# Adds "Another line" to the end of the file
echo "Another line" >> file_listing.txt
< (ইনপুট রিডাইরেকশন)উদ্দেশ্য: একটি কমান্ডের স্ট্যান্ডার্ড ইনপুট (stdin) একটি ফাইল থেকে রিডাইরেক্ট করা।
আচরণ: কমান্ডটি কীবোর্ডের বদলে নির্দিষ্ট করা ফাইল থেকে তার ইনপুট পড়ে।
উদাহরণ:
# 'tr' reads from 'lowercase.txt' and
# output is redirected to 'uppercase.txt'
tr 'a-z' 'A-Z' < lowercase.txt > uppercase.txt
2> (এরর রিডাইরেকশন):stderr) একটি ফাইলে রিডাইরেক্ট করা।# Error message from 'rm' is sent to 'error_log.txt'
rm non_existent_file 2> error_log.txt
আপনি 2>> দিয়ে স্ট্যান্ডার্ড এরর একটি ফাইলে অ্যাপেন্ড করতে পারেন।
এমন রিডাইরেকশনও আছে যা stdin ও stderr দুটোই একত্র করতে পারে।
বিস্তারিত জানতে ম্যানুয়াল দেখুন।
/dev/null/dev/null একটি বিশেষ ফাইল, যা
এটিকে কখনও কখনও "বিটবাকেট" নামে ডাকা হয়। আউটপুট বা এরর লুকিয়ে ফেলতে এটি কাজে লাগে।
some_command > /dev/null # Discards stdout
some_command 2> /dev/null # Discards stderr
# Using /dev/null as input will prevent the command
# from reading data from the keyboard
some_command < /dev/null
একসাথে একাধিক রিডাইরেকশন দেওয়া যায়।
some_command < input.txt > output.txt 2> error.txt
একটি রিডাইরেকশন কপি করা যায়।
# send stderr to the same destination as stdout
some_command > output.txt 2>&1
আপনি যখন 2>&1 দেখেন, তখন এভাবে পড়ুন: "stderr-কে সেখানে রিডাইরেক্ট করুন, যেদিকে stdout এই মুহূর্তে দেখাচ্ছে"।
Bash রিডাইরেকশন নির্দেশগুলো কঠোরভাবে বাম থেকে ডানে প্রক্রিয়া করে, তাই আপনি এটা করতে পারেন:
# redirect stdout to 'output1.txt'
# redirect stderr to the same place
# then change stdout to 'output2.txt'
some_command > output1.txt 2>&1 > output2.txt
শেল প্রোগ্রামিং এবং Linux/Unix-এর মতো অপারেটিং সিস্টেমের প্রসঙ্গে, একটি ফাইল ডেসক্রিপ্টর (FD) হলো একটি অঋণাত্মক পূর্ণসংখ্যা, যা একটি খোলা ফাইল বা I/O (ইনপুট/আউটপুট) রিসোর্সের শনাক্তকারী বা হ্যান্ডেল হিসেবে কাজ করে। এটি এমন একটি লেবেল বা রেফারেন্স নম্বরের মতো ভাবুন, যা দিয়ে অপারেটিং সিস্টেম খোলা ফাইল ও ডেটা স্ট্রিমের হিসাব রাখে।
রিডাইরেকশনের বাম দিকে যে সংখ্যাগুলো দেখেন, সেগুলোই ফাইল ডেসক্রিপ্টর।
স্ট্যান্ডার্ড I/O স্ট্রিমগুলোকে প্রথম ৩টি ফাইল ডেসক্রিপ্টর দেওয়া হয়:
exec কমান্ড ও রিডাইরেকশন অপারেটরের সাহায্যে নতুন ফাইল ডেসক্রিপ্টর সেট বা তৈরি করা যায়।
# create FD 3 as a copy of stdout
exec 3>&1
# send stdout to a log file
exec > log.txt
# then redirect both stdout and file descriptor 3
echo "some debug message" >&3 # displayed in the terminal
some_command 2>&1 # stdout and stderr send to 'log.txt'
এই কৌশলটি বেশ জটিল মনে হতে পারে, তবে এটি এমন পরিস্থিতিতে খুবই কাজে লাগতে পারে, যেখানে আপনার স্ক্রিপ্ট অন্য কোনো সফটওয়্যার প্যাকেজ চালাচ্ছে এবং স্ট্যান্ডার্ড আউটপুট সেই সফটওয়্যার স্বয়ংক্রিয়ভাবে ধরে নিচ্ছে।
এই ট্র্যাকের ইউনিট টেস্ট চালাতে ব্যবহৃত bats কমান্ডটি এভাবেই কাজ করে: bats একটি টেস্টের stdout ও stderr ধরে নেয়, কিন্তু FD 3-এ পাঠানো ডিবাগ মেসেজ টার্মিনালে দেখানো হয়।
রিডাইরেকশন কেন কাজে লাগে?
শেল রিডাইরেকশন দিয়ে প্রোগ্রামগুলো কীভাবে ডেটার সাথে কাজ করে তার সূক্ষ্ম নিয়ন্ত্রণ পাওয়া যায়, যা আপনাকে জটিল ওয়ার্কফ্লো তৈরি করতে এবং তথ্য কার্যকরভাবে সামলাতে সাহায্য করে।