Here document (Heredoc) হলো একটি ইনপুট বা ফাইল স্ট্রিম লিটারেল যা একটি স্পেশাল কোড ব্লক হিসেবে ট्रीট করা হয়। এই কোড ব্লকটি প্রসেস করার জন্য একটি কমান্ডে পাস করা হয়। Heredoc UNIX শেল থেকে উদ্ভূত এবং পপুলার লিনাক্স শেল যেমন sh, tcsh, ksh, bash, zsh, csh-এ পাওয়া যায়। উল্লেখযোগ্যভাবে, Perl, Ruby, PHP মত অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজও heredoc সাপোর্ট করে।
Herdoc-এর স্ট্রাকচার
Heredoc ২টি অ্যাঙ্গেল ব্র্যাকেট (<<) ব্যবহার করে যেটির পর একটি delimiter token থাকে। একই delimiter token ব্যবহার করে কোড ব্লক টার্মিনেট করা হয়। ডিলিমিটারের ভিতরে যা কিছু থাকে সেটিকে কোড ব্লক হিসেবে বিবেচনা করা হয়।
নিচের উদাহরণটি দেখুন। আমি কোড ব্লকটি cat কমান্ডে রিডাইরেক্ট করছি। এখানে ডিলিমিটার সেট করা হয়েছে BLOCK এবং একই BLOCK দিয়ে টার্মিনেট করা হয়েছে।
cat << BLOCK
Hello world
Today date is $(date +%F)
My home directory = ${HOME}
BLOCK
নোট: ব্লক শুরু এবং টার্মিনেট করার জন্য একই delimiter token ব্যবহার করতে হবে।
মাল্টিলাইন কমেন্ট তৈরি করুন
আপনি যদি কখনো bash-এ কোডিং করেন, তবে জানতে পারেন bash ডিফল্টভাবে C বা Java-এর মতো multiline comments সাপোর্ট করে না। HereDoc ব্যবহার করে এটাকে অতিক্রম করতে পারেন।
এটি bash-এ multiline comment সাপোর্ট করার বিল্ট-ইন ফিচার নয়, বরং একটি হ্যাক। যদি আপনি heredoc কোনো কমান্ডে রিডাইরেক্ট না করেন, ইন্টারপ্রেটার কোড ব্লকটি পড়বে কিন্তু এক্সিকিউট করবে না।
<< COMMENT This is comment line 1 This is comment line 2 This is comment line 3 COMMENT
হোয়াইট স্পেস হ্যান্ডলিং
ডিফল্টভাবে, heredoc কোনো হোয়াইট স্পেস ক্যারেক্টার (ট্যাব, স্পেস) সপ্রেস করে না। dash (-) যোগ করে (<<)-এর পর ডিলিমিটারের আগে এই আচরণ ওভাররাইড করা যায়। এটি সব ট্যাব স্পেস সপ্রেস করবে কিন্তু হোয়াইট স্পেস সপ্রেস করবে না।
cat <<- BLOCK This line has no whitespace. This line has 2 white spaces at the beginning. This line has a single tab. This line has 2 tabs. This line has 3 tabs. BLOCK
ভেরিয়েবল এবং কমান্ড সাবস্টিটিউশন
Heredoc ভেরিয়েবল সাবস্টিটিউশন এক্সেপ্ট করে। ভেরিয়েবলগুলো ইউজার-ডিফাইনড বা এনভায়রনমেন্টাল ভেরিয়েবল হতে পারে।
TODAY=$(date +%F)
cat << BLOCK1
# User defined variables
Today date is = ${TODAY}
#Environ Variables
I am running as = ${USER}
My home dir is = ${HOME}
I am using ${SHELL} as my shell
BLOCK1
একইভাবে, আপনি heredoc কোড ব্লকের ভিতরে যেকোনো কমান্ড রান করতে পারেন।
cat << BLOCK2 $(uname -a) BLOCK2
স্পেশাল ক্যারেক্টার এস্কেপ করা
স্পেশাল ক্যারেক্টার এস্কেপ করার বেশ কিছু উপায় আছে। হয় ক্যারেক্টার লেভেলে বা ডক লেভেলে।
ইন্ডিভিজুয়াল স্পেশাল ক্যারেক্টার এস্কেপ করতে ব্যাকস্ল্যাশ (\) ব্যবহার করুন।
cat << BLOCK4
$(uname -a)
BLOCK4
cat << BLOCK5
Today date is = ${TODAY}
BLOCK5
ব্লকের ভিতরের সব স্পেশাল ক্যারেক্টার এস্কেপ করতে ডিলিমিটারকে সিঙ্গল কোট, ডাবল কোট দিয়ে ঘেরুন অথবা ডিলিমিটারের আগে ব্যাকস্ল্যাশ প্রিফিক্স করুন।
cat << 'BLOCK1'
I am running as = ${USER}
BLOCK1
cat << "BLOCK2"
I am running as = ${USER}
BLOCK2
cat << \BLOCK3
I am running as = ${USER}
BLOCK3
এখন যেহেতু আমরা heredoc-এর স্ট্রাকচার এবং কীভাবে কাজ করে সেটি জানি, চলুন কিছু উদাহরণ দেখি। heredoc-এর দুটি সাধারণ ব্যবহার ক্ষেত্র হলো SSH-ওয়ার ব্লক অফ কমান্ড রান করা এবং SQL কোয়েরি heredoc থ্রু পাস করা।
নিচের উদাহরণে, আমরা SSH থ্রু একটি রিমোট সার্ভারে কোড ব্লক এক্সিকিউট করার চেষ্টা করছি।
নিচের উদাহরণে আমি psql-এ একটি select স্টেটমেন্ট heredoc থ্রু পাস করছি ডেটাবেস কানেক্ট করে কোয়েরি রান করার জন্য। এটি bash স্ক্রিপ্টের ভিতরে -f ফ্ল্যাগ ব্যবহার করে .sql ফাইল রান করার একটি অল্টারনেটিভ পথ।
#!/usr/bin/env bash
UNAME=postgres
DBNAME=testing
psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK
SELECT * FROM COUNTRIES WHERE region_id = 4;
BLOCK
এই আর্টিকেলের জন্য এতটুকু। আপনি heredoc-এর সাথে আরও অনেক কিছু করতে পারেন যা আমরা উদাহরণে দেখিয়েছি। আপনার কোনো useful hack heredoc-এর সাথে থাকলে কমেন্ট সেকশনে পোস্ট করুন যাতে আমাদের পাঠকরা উপকৃত হয়।