Bash स्क्रिप्टिंग में "हियर डॉक्युमेंट" (या "हियरडॉक") किसी कमांड या प्रोग्राम की ओर इनपुट की कई लाइनें मोड़ देता है, जैसे आप उन्हें सीधे टर्मिनल में टाइप कर रहे हों। अपनी स्क्रिप्ट के अंदर कई लाइनों वाला टेक्स्ट एम्बेड करने का यह एक शक्तिशाली टूल है, जिसके लिए बाहरी फाइलों या जटिल स्ट्रिंग मैनिपुलेशन की ज़रूरत नहीं पड़ती।
डेलिमिटर: हियरडॉक << ऑपरेटर से शुरू होता है, जिसके बाद एक डेलिमिटर शब्द आता है (इसे अक्सर "मार्कर" या "टर्मिनेटर" कहा जाता है)।
यह डेलिमिटर आपका चुना हुआ कोई भी शब्द हो सकता है, लेकिन स्पष्टता के लिए आम तौर पर EOF, END या TEXT जैसा कुछ इस्तेमाल किया जाता है।
ज़्यादा पढ़ने लायक कोड के लिए आप कोई वर्णनात्मक डेलिमिटर भी रख सकते हैं, जैसे END_INSTALLATION_INSTRUCTIONS।
कंटेंट: शुरुआती << DELIMITER के बाद आप वह कंटेंट लिखते हैं जिसे आप भेजना चाहते हैं।
यह टेक्स्ट, कोड या किसी और चीज़ की कई लाइनें हो सकती हैं।
समाप्ति: हियरडॉक तब खत्म होता है जब डेलिमिटर शब्द फिर से अपनी अलग लाइन पर आ जाए, और उसके आगे या पीछे कोई व्हाइटस्पेस न हो।
command << DELIMITER
Content line 1
Content line 2
...
Content line N
DELIMITER
<< DELIMITER और अंतिम DELIMITER के बीच की सारी लाइनें पढ़ता है।cat << EOF
This is the first line.
This is the second line.
This is the third line.
EOF
आउटपुट:
This is the first line.
This is the second line.
This is the third line.
इस उदाहरण में:
cat कमांड है।<< EOF हियरडॉक को EOF डेलिमिटर के साथ शुरू करता है।EOF हियरडॉक को खत्म करता है।cat जो कंटेंट उसे मिला, उसे आउटपुट करता है।wc -l << END
Line 1
Line 2
Line 3
END
आउटपुट:
3
यहाँ wc -l लाइनों की संख्या गिनता है।
हियरडॉक उन तीन लाइनों को इनपुट के रूप में देता है।
स्क्रिप्ट:
#!/usr/bin/env bash
# Script to process input
while IFS= read -r line; do
echo "Processing: $line"
done
इंटरैक्टिव bash प्रॉम्प्ट से हियरडॉक के साथ स्क्रिप्ट को कॉल कीजिए:
./your_script << MY_DATA
Item 1
Item 2
Item 3
MY_DATA
आउटपुट:
Processing: Item 1
Processing: Item 2
Processing: Item 3
Bash हियरडॉक के अंदर वेरिएबल एक्सपैंशन, कमांड सब्स्टिट्यूशन और अरिथमेटिक एक्सपैंशन करता है। इस मायने में हियरडॉक डबल कोट स्ट्रिंग की तरह व्यवहार करते हैं।
cat << EOF
The value of HOME is $HOME
The current date is $(date)
Two plus two is $((2 + 2))
EOF
आउटपुट:
The value of HOME is /home/glennj
The current date is Thu Apr 24 13:47:32 EDT 2025
Two plus two is 4
जब डेलिमिटर को कोट किया जाता है (सिंगल या डबल कोट के साथ), तो ये एक्सपैंशन रुक जाते हैं। कंटेंट को जैसा है वैसा ही लिया जाता है। यह सिंगल कोट स्ट्रिंग की तरह है।
cat << 'EOF'
The value of $HOME is not expanded here.
The result of $(date) is not executed.
Two plus two is calculated by $((2 + 2))
EOF
आउटपुट:
The value of $HOME is not expanded here.
The result of $(date) is not executed.
Two plus two is calculated by $((2 + 2))
अगर आप << की जगह <<- (अंत में हाइफन के साथ) इस्तेमाल करते हैं, तो Bash हियरडॉक की हर लाइन से शुरुआत के टैब अक्षर हटा देता है।
यह आपकी स्क्रिप्ट में हियरडॉक के कंटेंट को इंडेंट करने के लिए काम का है, बिना आउटपुट पर असर डाले।
# Note, the leading whitespace is tab characters only, not spaces!
# The ending delimiter can have leading tabs as well.
cat <<- END
This line has 1 leading tab.
This line has a leading tab and some spaces.
This line 2 leading tabs.
END
आउटपुट सारे शुरुआती टैब हटाकर छापा जाता है:
This line has 1 leading tab.
This line has a leading tab and some spaces.
This line 2 leading tabs.
लेखक इस तरीके की सलाह नहीं देते। हालाँकि यह स्क्रिप्ट की पठनीयता बढ़ा सकता है,
एक आम उपयोग यह हो सकता है कि आप कुछ मदद टेक्स्ट दें:
#!/usr/bin/env bash
usage() {
cat << END_USAGE
Refresh database tables.
usage: ${0##*/} [-h|--help] [-A|--no-archive]
where: --no-archive flag will _skip_ the archive jobs
END_USAGE
}
# ... parsing command line options here ...
if [[ $flag_help == "true" ]]; then
usage
exit 0
fi
हियर डॉक्युमेंट की तरह, हियर स्ट्रिंग (या "हियरस्ट्रिंग") भी किसी कमांड को इनपुट देती हैं।
लेकिन जहाँ हियरडॉक टेक्स्ट के एक ब्लॉक के रूप में दिए जाते हैं, वहीं हियरस्ट्रिंग टेक्स्ट की एक ही स्ट्रिंग के रूप में दी जाती हैं।
हियर स्ट्रिंग <<< "text" सिंटैक्स इस्तेमाल करती हैं।
tr 'a-z' 'A-Z' <<< "upper case this string"
आउटपुट:
UPPER CASE THIS STRING
हियरडॉक के उलट, इसमें कोई अंतिम डेलिमिटर देने की ज़रूरत नहीं होती।
हियर स्ट्रिंग की जगह पाइपलाइन भी इस्तेमाल की जा सकती है:
echo "upper case this string" | tr 'a-z' 'A-Z'
तो हियर स्ट्रिंग क्यों इस्तेमाल करें?
ऐसी स्थिति की सोचिए जहाँ आपको किसी लंबी चलने वाली गणना से आउटपुट के रूप में एक स्ट्रिंग मिलती है, और आप उस परिणाम को दो अलग-अलग कमांडों को देना चाहते हैं। पाइपलाइन इस्तेमाल करने पर आपको वह गणना दो बार चलानी पड़ती है:
some_long_running_calculation | first_command
some_long_running_calculation | second_command
एक ज़्यादा कुशल तरीका यह है कि आप गणना का आउटपुट पकड़ लें (कमांड सब्स्टिट्यूशन की मदद से), और फिर उन दोनों अगली कमांडों को इनपुट देने के लिए हियर स्ट्रिंग इस्तेमाल करें:
result=$( some_long_running_calculation )
first_command <<< "$result"
second_command <<< "$result"
वास्तविक जीवन में उस उदाहरण का एक उपयोग यह है:
# initialize the output CSV file
echo "ID,VALUE" > data.csv
url='https//example.com/api/query?page=1'
while true; do
json=$( curl "$url" )
# convert the results part of the response into CSV
jq -r '.results[] | [.id, .value] | @csv' <<< "$json"
# get the URL for the next page
url=$( jq -r '.next_url // ""' <<< "$json" )
if [[ "$url" == "" ]]; then
break
fi
done >> data.csv
आउटपुट रीडायरेक्शन की जगह पर ध्यान दीजिए।
while लूप का सारा आउटपुट data.csv फाइल में जोड़ा जाएगा।
चूँकि ये रीडायरेक्शन के ही रूप हैं, इन्हें दूसरे रीडायरेक्शन ऑपरेशनों के साथ जोड़ा जा सकता है:
cat <<< END_OF_TEXT > output.txt
This is my important text.
END_OF_TEXT
awk '...' <<< "$my_var" >> result.csv
हियर डॉक्युमेंट (या "हियरडॉक") Bash स्क्रिप्ट में कई लाइनों वाला इनपुट संभालने का एक लचीला और सुविधाजनक तरीका हैं। ये टेक्स्ट और डेटा को सीधे आपकी स्क्रिप्ट के अंदर एम्बेड करने की प्रक्रिया आसान बनाते हैं, जिससे स्क्रिप्ट ज़्यादा आत्मनिर्भर और पढ़ने में आसान हो जाती हैं।
हियर स्ट्रिंग (या "हियरस्ट्रिंग") हियर डॉक्युमेंट की तरह हैं, लेकिन ज़्यादा सरल और लचीला सिंटैक्स देती हैं।