কম্পিউটার টিউটোরিয়াল

ব্যাশ ও লিনাক্স শেলে Heredoc (Here Documents) মাস্টার করুন

এই আর্টিকেলে দেখানো হবে কিভাবে ব্যাশ/শেল স্ক্রিপ্টে Heredoc (Here Document) ব্যবহার করে মাল্টি-লাইন টেক্সট নিয়ে কাজ করা যায়।

Heredoc সবচেয়ে বেশি কাজে আসে মাল্টি-লাইন ইনপুট গ্রহণের জন্য — ব্যবহারকারী এক লাইন লিখে এন্টার চাপবে, পরের লাইন লিখবে, এভাবে চালাবে। এছাড়া স্ক্রিপ্টে মাল্টি-লাইন টেক্সট ডিফাইন করার জন্যও এটি ব্যবহার করা যায়।

এটিও একটি ইন্টারঅ্যাক্টিভ প্রোগ্রামে একাধিক কমান্ড পাঠাতে ব্যবহার করা যায় — এটি উদাহরণে পরে দেখানো হবে।

এই আর্টিকেলের উদাহরণগুলো ব্যাশ এবং Zsh — দুটো শেলেই কাজ করবে।

স্ট্যান্ডার্ড ইনপুট, পাইপিং, এবং রিডাইরেকশন

Heredoc সাধারণত স্ট্যান্ডার্ড ইনপুট/আউটপুট এবং রিডাইরেকশন/পাইপিং کے সাথে ব্যবহার হয় যাতে মাল্টি-লাইন টেক্সটকে অন্যান্য কমান্ডে প্রসেসিং, ফরম্যাটিং, বা ডিসপ্লের জন্য পাঠানো যায়। এই টপিক আলাদা একটি আর্টিকেল দিয়ে ব্যাখ্যা করা উচিত, তাই এখানে লিংক দেওয়া হলো:

Redirect stdin, stdout, stderr in Linux/Bash, With Examples

নিচের উদাহরণগুলো উপরের আর্টিকেলে আলোচিত কনসেপ্ট এবং মেথডগুলো বিভিন্ন স্থানে ব্যবহার করবে।

ব্যাশ/Zsh Heredoc সিনট্যাক্স

একটি Heredoc শুরু করতে কেবল << কমান্ড ব্যবহার করতে হয়। এটি উপরে বর্ণিত ইনপুট/আউটপুট রিডাইরেকশনের একটি রূপ।

Heredoc ব্যবহারের সিনট্যাক্স নিচের মতো:

COMMAND <

লক্ষ্য করুন:

  • COMMAND যেকোনো লিনাক্স কমান্ড বা স্ক্রিপ্ট হতে পারে — heredoc-এ থাকা টেক্সট কন্টেন্ট রিডাইরেকশন ব্যবহার করে এটিতে পাঠানো হবে
  • << Heredoc স্টেটমেন্টের শুরু নির্ধারণ করে
    • যদি আপনি মাল্টি-লাইন টেক্সট ইনডেন্ট করতে চান, তবে <<- ব্যবহার করুন (ড্যাশ যোগ করা হয়েছে) — এটি প্রতিটি লাইন থেকে লিডিং ট্যাব সরিয়ে দেবে
  • LIMITSTRING হল वह স্ট্রিং যা টাইপ করলে Heredoc-এ টেক্সট ইনপুট শেষ হবে
    • Heredoc মাল্টি-লাইন, ব্যবহারকারী নতুন লাইনে যেতে ENTER চাপায়, তাই এন্টার চাপায় ইনপুট বন্ধ করা যায় না।
    • LIMITSTRING এর উপস্থিতি Heredoc-কে বলে দেয় যে টেক্সট ইনপুট শেষ, এখন ফিনিশ করো।
    • এটি যেকোনো কিছু হতে পারে — নিশ্চিত করুন যে আপনার টেক্সটে সেটি আসবে না, না হলে আগে থেমে যাবে।
    • সাধারণ অনুশীলন হল EOF (End Of File) টেক্সটটি LIMITSTRING হিসেবে ব্যবহার করা — যতক্ষণ না এটি Heredoc-এ ইনপুট হিসেবে আসে।
  • আপনি যত ইচ্ছে তত লাইন টেক্সট রাখতে পারেন

Heredoc উদাহরণ

মাল্টি-লাইন টেক্সট ইনপুট গ্রহণ করা

এই উদাহরণে একাধিক লাইন টেক্সট গ্রহণ করে cat কমান্ডে পাঠানো হবে ডিসপ্লের জন্য:

cat <

উপরের উদাহরণটি আপনার টার্মিনাল প্রোগ্রামে টাইপ করতে হবে।

ভেরিয়েবল ব্যবহার করা

Heredoc-এ শেল ভেরিয়েবল ব্যবহার করা যায়:

cat <

উপরে, $PWD ভেরিয়েবলটি Heredoc-এ একটি লাইনে ডিসপ্লে হয়েছে — এই ভেরিয়েবলটি বর্তমান ওয়ার্কিং ডিরেক্টরির মান ধারণ করে।

Heredoc-এর আউটপুট রিডাইরেক্ট করা

স্ট্যান্ডার্ড রিডাইরেকশন (আগে না জানলে আর্টিকেলের শুরুতে দেখুন) ব্যবহার করে Heredoc-এর কন্টেন্ট COMMAND-এ পাঠানোর পর অন্য প্রোগ্রাম বা ফাইলে পাঠানো যায়:

cat < output.txt This is line 1 This is line 2 Your current directory is $PWD EOF

উপরে, cat Heredoc-এর কন্টেন্ট পড়ে, এবং cat-এর আউটপুট > কমান্ড ব্যবহার করে output.txt ফাইলে রিডাইরেক্ট ও লেখা হয়েছে।

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

আপনি একটি স্ক্রিপ্টে Heredoc ব্যবহার করতে পারেন। যেহেতু শেল স্ক্রিপ্ট শুধু লাইন বাই লাইন কমান্ডের তালিকা যা শেলে ফিড করা হয়, তাই এটি একইভাবে আচরণ করবে।

স্ক্রিপ্ট কোড ইনডেন্ট করা সুবিধাজনক — যদি আপনি চান যে ট্যাবগুলো টেক্সটে না আসে, তবে Heredoc ডিক্লারেশনে – (ড্যাশ) যোগ করুন যাতে প্রতিটি লাইন শুরু থেকে হোয়াইটস্পেস সরিয়ে ফেলা হয়:

#!/bin/bash if $trueOrFalse; then cat <<-EOF > output.txt This is line 1 This is line 2 Your current directory is $PWD EOF fi #!/bin/bash

Heredoc কে একটি ভেরিয়েবলে অ্যাসাইন করা

Heredoc-এ থাকা মাল্টি-লাইন টেক্সট cat কমান্ড দিয়ে পড়ে আউটপুটকে একটি ভেরিয়েবলে অ্যাসাইন করা যায়:

mytext=$(cat <<-EOF This is line 1 This is line 2 Your current directory is $PWD EOF ) echo $mytext

ইন্টারঅ্যাক্টিভ প্রোগ্রামে একাধিক কমান্ড পাঠানো

Heredoc দিয়ে একটি ইন্টারঅ্যাক্টিভ প্রোগ্রামে একাধিক লাইন টেক্সট পাঠানো যায়। কিছু প্রোগ্রাম লঞ্চ হলে ব্যবহারকারী থেকে কমান্ড এক্সপেক্ট করে — সেগুলো টেক্সট প্রসেসিং এর জন্য এক্সেপ্ট করতে পারে বা নিজস্ব শেল দিয়ে কমান্ড ইস্যু করতে পারে।

একটি উদাহরণ হল MySQL — একবার MySQL লঞ্চ হয়ে সার্ভারের সাথে কানেক্ট হলে, আপনি নিজের কমান্ড টাইপ করে এন্টার চাপায় ডেটা কোয়েরি করতে পারেন। Heredoc ব্যবহার করে এই কমান্ডها আগে থেকে লিখে রাখা যায় এবং ইউজার ইন্টারঅ্যাকশন ছাড়া MySQL-এ পাঠানো যায়:

mysql -uUSERNAME -pPASSWORD DATABASE <

উপরে, MySQL কমান্ড দিয়ে USERNAME এবং PASSWORD দিয়ে একটি DATABASE-এ কানেক্ট করা হয়েছে।

কানেকশন রেডি হলে দুইটি সিকোয়েনশিয়াল কমান্ড ইস্যু হবে — একটি SHOW TABLES এবং অন্যটি posts টেবিল থেকে সকল রেকর্ড SELECT করার জন্য।

  1. উইন্ডোজ ১০-এ লিনাক্স ব্যাশ শেল ইনস্টল করুন: সম্পূর্ণ ধাপে ধাপে গাইড

  2. ব্যাশ ভেরিয়েবল মাস্টার করুন: গ্লোবাল ও লোকাল ব্যবহারের ৬টি প্র্যাক্টিক্যাল উদাহরণ

  3. ব্যাশ শেল ফাংশন মাস্টার করুন: ৬টি প্র্যাক্টিক্যাল উদাহরণ ও টিপস

  4. ব্যাশ স্ক্রিপ্টিং মাস্টার করুন: ৫টি রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাক্টিক্যাল ইন্ট্রোডাকশন