ট্র্যাক
/
Bash
Bash
/
সিলেবাস
/
রিডাইরেকশন
রি

রিডাইরেকশন মধ্যে Bash

{one: "১টি অনুশীলনী", other: "%{count}টি অনুশীলনী"}

রিডাইরেকশন সম্পর্কে

কমান্ড-লাইন ইন্টারফেসের জগতে প্রোগ্রামগুলো প্রায়ই তিনটি স্ট্যান্ডার্ড ডেটা স্ট্রিমের সাথে কাজ করে:

  1. স্ট্যান্ডার্ড ইনপুট (stdin): যেখান থেকে একটি প্রোগ্রাম তার ইনপুট পায় (সাধারণত কীবোর্ড থেকে)।
  2. স্ট্যান্ডার্ড আউটপুট (stdout): যেখানে একটি প্রোগ্রাম তার স্বাভাবিক আউটপুট পাঠায় (সাধারণত টার্মিনাল স্ক্রিনে)।
  3. স্ট্যান্ডার্ড এরর (stderr): যেখানে একটি প্রোগ্রাম এরর মেসেজ পাঠায় (সাধারণত টার্মিনাল স্ক্রিনে)।

মনে করুন, এই স্ট্রিমগুলোর সাথে আমরা পাইপলাইন ও কমান্ড লিস্ট অধ্যায়ে পরিচয় করিয়েছিলাম।

Note

পাইপলাইনকে রিডাইরেকশনের একটি রূপ হিসেবে ধরা যেতে পারে: একটি প্রোগ্রামের স্ট্যান্ডার্ড আউটপুট সরাসরি আরেকটি প্রোগ্রামের স্ট্যান্ডার্ড ইনপুটে পাঠানো হয়। পাইপলাইন নিয়ে আমরা ইতিমধ্যে আলোচনা করেছি। এই কনসেপ্টে ফাইল থেকে এবং ফাইলে রিডাইরেক্ট করা নিয়ে আলোচনা করা হবে।

শেল রিডাইরেকশন একটি শক্তিশালী পদ্ধতি, যা দিয়ে আপনি এই স্ট্রিমগুলোর গন্তব্য বদলাতে পারেন। প্রোগ্রাম কীবোর্ড থেকে পড়বে বা স্ক্রিনে লিখবে, তার বদলে আপনি একটি ফাইল থেকে ইনপুট রিডাইরেক্ট করতে পারেন বা আউটপুট একটি ফাইলে পাঠাতে পারেন। এতে প্রোগ্রামগুলো কীভাবে ডেটার সাথে কাজ করে, তার উপর যথেষ্ট নমনীয়তা ও নিয়ন্ত্রণ পাওয়া যায়।

প্রধান রিডাইরেকশন অপারেটর

সবচেয়ে কমন রিডাইরেকশন অপারেটরগুলো এবং তারা কী করে, তা এখানে দেওয়া হলো:

> (আউটপুট রিডাইরেকশন)

  • উদ্দেশ্য: একটি কমান্ডের স্ট্যান্ডার্ড আউটপুট (stdout) একটি ফাইলে রিডাইরেক্ট করা।

  • আচরণ:

    • ফাইলটি না থাকলে সেটি তৈরি করা হয়।
    • ফাইলটি থাকলে তার বিষয়বস্তু ওভাররাইট হয়ে যায়।
  • উদাহরণ:

    # Sends the output of 'ls -l' to 'file_listing.txt'
    ls -l > file_listing.txt
    
Caution

কমান্ড চালানোর আগেই রিডাইরেকশন করা হয়। এর মানে হলো, যে ফাইল থেকে পড়তে হবে, ঠিক সেই ফাইলেই আপনি রিডাইরেক্ট করতে পারবেন না।

date > date.txt         # populate the file with the current date
cat date.txt > date.txt # 'date.txt' is now empty!

উপরের উদাহরণের দ্বিতীয় কমান্ডে,

  1. Bash প্রথমে রিডাইরেকশনে উল্লেখ করা ফাইলটি ট্রাংকেট করে। এতে আগের বিষয়বস্তু নষ্ট হয়ে ফাইলটি খালি হয়ে যায়।
  2. তারপর bash সদ্য খালি হওয়া ফাইলটি পড়ে।
  3. তারপর bash ফাইলের বিষয়বস্তু (অর্থাৎ কিছুই না) আবার ফাইলে লিখে।

>> (অ্যাপেন্ড আউটপুট রিডাইরেকশন)

  • উদ্দেশ্য: একটি কমান্ডের স্ট্যান্ডার্ড আউটপুট (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
Advanced

ফাইল ডেসক্রিপ্টর

শেল প্রোগ্রামিং এবং Linux/Unix-এর মতো অপারেটিং সিস্টেমের প্রসঙ্গে, একটি ফাইল ডেসক্রিপ্টর (FD) হলো একটি অঋণাত্মক পূর্ণসংখ্যা, যা একটি খোলা ফাইল বা I/O (ইনপুট/আউটপুট) রিসোর্সের শনাক্তকারী বা হ্যান্ডেল হিসেবে কাজ করে। এটি এমন একটি লেবেল বা রেফারেন্স নম্বরের মতো ভাবুন, যা দিয়ে অপারেটিং সিস্টেম খোলা ফাইল ও ডেটা স্ট্রিমের হিসাব রাখে।

রিডাইরেকশনের বাম দিকে যে সংখ্যাগুলো দেখেন, সেগুলোই ফাইল ডেসক্রিপ্টর।

স্ট্যান্ডার্ড I/O স্ট্রিমগুলোকে প্রথম ৩টি ফাইল ডেসক্রিপ্টর দেওয়া হয়:

  • স্ট্যান্ডার্ড ইনপুট হলো FD 0
  • স্ট্যান্ডার্ড আউটপুট হলো FD 1
  • স্ট্যান্ডার্ড এরর হলো FD 2

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-এ পাঠানো ডিবাগ মেসেজ টার্মিনালে দেখানো হয়।

সারসংক্ষেপ

রিডাইরেকশন কেন কাজে লাগে?

  • আউটপুট সংরক্ষণ: পরে দেখার বা প্রক্রিয়া করার জন্য একটি কমান্ডের ফলাফল জমা করে রাখা।
  • লগিং: ডিবাগ করার জন্য এরর মেসেজ ধরে রাখা।
  • অটোমেশন: একটি কমান্ডের আউটপুট আরেকটির ইনপুট হিসেবে ব্যবহার করে কমান্ডগুলোকে শৃঙ্খলাবদ্ধ করা।
  • ফিল্টারিং: অবাঞ্ছিত আউটপুট ফেলে দেওয়া।
  • ব্যাচ প্রসেসিং: হাতে টাইপ না করে ফাইল থেকে ডেটা প্রক্রিয়া করা।
  • স্ক্রিপ্টিং: মজবুত শেল স্ক্রিপ্ট লেখার জন্য রিডাইরেকশন অপরিহার্য।

শেল রিডাইরেকশন দিয়ে প্রোগ্রামগুলো কীভাবে ডেটার সাথে কাজ করে তার সূক্ষ্ম নিয়ন্ত্রণ পাওয়া যায়, যা আপনাকে জটিল ওয়ার্কফ্লো তৈরি করতে এবং তথ্য কার্যকরভাবে সামলাতে সাহায্য করে।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে