हियर डॉक्यूमेंट (Heredoc) एक इनपुट या फ़ाइल स्ट्रीम लिटरल है जिसे कोड के एक विशेष ब्लॉक के रूप में माना जाता है। कोड का यह ब्लॉक प्रोसेसिंग के लिए एक कमांड को पास किया जाएगा। Heredoc UNIX शेल्स में उत्पन्न होता है और sh, tcsh, ksh, bash, zsh, csh जैसे लोकप्रिय लिनक्स शेल्स में पाया जा सकता है। विशेष रूप से, पर्ल, रूबी, PHP जैसी अन्य प्रोग्रामिंग भाषाएं भी heredoc का समर्थन करती हैं।
Herdoc की संरचना
Heredoc 2 एंगल ब्रैकेट (<<) का उपयोग करता है जिसके बाद एक डिलीमीटर टोकन होता है। वही डिलीमीटर टोकन कोड ब्लॉक को समाप्त करने के लिए उपयोग किया जाएगा। डिलीमीटर के भीतर जो कुछ भी आता है उसे कोड ब्लॉक माना जाता है।
नीचे दिए गए उदाहरण को देखें। मैं कोड ब्लॉक को cat कमांड पर रीडायरेक्ट कर रहा हूँ। यहां डिलीमीटर BLOCK पर सेट है और उसी BLOCK द्वारा समाप्त होता है।
cat << BLOCK
Hello world
Today date is $(date +%F)
My home directory = ${HOME}
BLOCK
नोट: ब्लॉक शुरू करने और समाप्त करने के लिए आपको एक ही डिलीमीटर टोकन का उपयोग करना चाहिए।
मल्टीलाइन कमेंट्स बनाएं
यदि आप अभी कुछ समय से bash में कोडिंग कर रहे हैं, तो आप जानते होंगे कि bash डिफ़ॉल्ट रूप से C या Java की तरह मल्टीलाइन कमेंट्स का समर्थन नहीं करता। आप HereDoc का उपयोग करके इसे दूर कर सकते हैं।
यह bash की मल्टी-लाइन कमेंट का समर्थन करने वाली बिल्ट-इन सुविधा नहीं है, बल्कि सिर्फ एक हैक है। यदि आप heredoc को किसी कमांड पर रीडायरेक्ट नहीं कर रहे हैं, तो इंटरप्रेटर केवल कोड ब्लॉक को पढ़ेगा और कुछ भी निष्पादित नहीं करेगा।
<< COMMENT This is comment line 1 This is comment line 2 This is comment line 3 COMMENT
व्हाइट स्पेस को संभालना
डिफ़ॉल्ट रूप से, heredoc किसी भी व्हाइट स्पेस कैरेक्टर (टैब, स्पेस) को दबाएगा नहीं। हम डैश (-) को (<<) के बाद डिलीमीटर के बाद जोड़कर इस व्यवहार को ओवरराइड कर सकते हैं। यह सभी टैब स्पेस को दबा देगा लेकिन व्हाइट स्पेस को दबाया नहीं जाएगा।
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
# उपयोगकर्ता-परिभाषित वेरिएबल्स
Today date is = ${TODAY}
# एनवायरनमेंट वेरिएबल्स
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 पर कमांड ब्लॉक चलाना और heredoc के माध्यम से SQL क्वेरी पास करना।
नीचे दिए गए उदाहरण में, हम SSH के माध्यम से एक रिमोट सर्वर पर कोड ब्लॉक निष्पादित करने का प्रयास कर रहे हैं।
नीचे दिए गए उदाहरण में मैं psql से कनेक्ट करने और क्वेरी चलाने के लिए select स्टेटमेंट को psql पर पास कर रहा हूँ। यह bash स्क्रिप्ट के अंदर psql में क्वेरी चलाने का एक वैकल्पिक तरीका है बजाय -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 के साथ आप उससे कहीं अधिक कर सकते हैं जितना हमने उदाहरणों में दिखाया है। यदि आपके पास heredoc के साथ कोई उपयोगी हैक है तो कृपया इसे कमेंट सेक्शन में पोस्ट करें ताकि हमारे पाठक उससे लाभ उठा सकें।