הירדוקיומנט

**הירדוקיומנט** או בקצרה **הירדוק** (מאנגלית: Heredocument; נכתב גם Heredoc) הוא סוג של תיבת קוד בשפות תסריט שונות (ובפרט מסוג Bourne) המשמש להרצה מקומית של סקריפט. ערך זה יתמקד בהירדוקים בשפת Bash.

קטע ההתחלה של ההירדוק (ה"פתיח" שלו) מורכב מאופרטור ההירדוק שהוא סימן קטן-מ כפול (>>) ומשם ההירדוק. הפתיח הוא למעשה תחילת השידור וקטע הסוף שלו (ה"תוחם") שלו הוא למעשה סוף השידור.

נהוג לכתוב שמות הירדוק באותיות אנגליות גדולות ומונח נפוץ לכך הוא הביטוי EOT (הביטוי EOT משקף תו המסמל שידור תחום ופירושו End Of Transmission); גרסה של השם הזה היא EOF ופירושה הוא End Of File אם כי ביטוי זה אינו משקף את תו ה-EOT. עם זאת, ניתן להשתמש בכל שם שרוצים ואין חובה לכתוב את אחד משני הביטויים הללו (הנטייה לכתוב EOT נובעת רק מסיבות מסורתיות ואין שום הכרח לכך).

אם יש חזרה על אותו השם (בתוך הירדוק פנימי - ראו בהמשך) אזי נהוג למספר את השמות הבאים בשיטת המנייה מ-0 (Zero base indexing) שכן במערכות לינוקס נהוגה שיטה זו ומכאן ביטויים כמו E0T0, EOT1, EOT2 וכן הלאה.

הירדוק הוא למעשה שיטת הפניה של **קלט להתהליך** (I/O redirection method), כאשר במקום להפנות לקובץ רגיל שאותו נריץ כסקריפט sh, אנו מפנים לקובץ שאותו נריץ (אם כי ניתן להפנות פלט לקובץ מתוך תהליך ההירדוק עצמו למשל על ידי הרצה של cat בתוך ההירדוק ותינתן דוגמה בהמשך).

## קטע ההתחלה וקטע הסיום
קטע ההתחלה של הירדוק, ה"פתיח" שלו, מורכב משני חלקים, האחד סימן "קטן מ-" כפול (>>) והשני שם ההירדוק. הפתיח מקדים את קטע הסיום שלו, ה"תוחם" שלו. קטע הסיום נקרא Delimeter ולעיתים גם Terminator והוא נכתב פשוט כשם ההירדוק (נניח EOT).

## הירדוקים פנימיים
ניתן לשלב הירדוק בתוך הירדוק. כך, למשל, אם שמנו סקריפט של בערך 100 שורות בתוך הירדוק, ניתן לשלב בתוך הסקריפט עצמו במידת הצורך הירדוק משני. מקרה בו זה נדרש הוא כאשר רוצים לשלב בסקריפט הירדוק שמכיל cat שמפנה פלט בן מספר שורות לקובץ רגיל מסוים. דוגמת קוד תהיה זו:


```text
bash /dev/fd/3 3<<'EOT0'
Command
cat <<EOT1 >> /etc/apache2/apache2.conf
Command
EOT1
EOT0
```


* יש להבדיל בין סימן הקטן-מ כפול (סימן ההירדוק) לבין הסימן גדול-מ כפול, שמשמש כאשר מפנים פלט מן ההירדוק אל תוך קובץ רגיל כמו עם cat.
* בהירדוק החיצוני הסיבה שמופיעה הפקודה Bash לפני ההירדוק החיצוני היא משום שהקוד תואם ל bash ואם אנו נמצאים בסביבה שאיננה bash בתוך המכונה שכוללת bash הרי שרק ככה נוכל להריץ את הפקודה. 
* בהירדוק החיצוני אנו מעבירים את הארגומנט dev/fd/3 לפקודה bash כדי ליצור קובץ המתאר שלו (כלומר ה File descriptor שלו) אינו 0,1 או 2 (שהם המתארים של הקלט התקני, הפלט התקני והפלט השגוי בהתאמה) ובמקרה הזה הוא 3. במקום 3 יכלנו להשתמש גם בכל מתאר פנוי אחר. החלק השני בארגיומנט הוא גם כן 3 (הספרה השנייה של המספר 3 תופיע ברווח בודד אחרי הארגיומנט הראשון ומיד לפני שם ההירדוק) והוא גורם שנקרא את הסקריפט מתוך אותו קובץ בתהליך שהגדרנו לפניכן (זה שה-File descriptor שלו הוא 3).

## הזחה בתוך הירדוק
בשביל להזיח פקודות בתוך הירדוק (כולל הירדוקים פנימיים בתוך ההירדוק) צריך להפעיל הזחה כפי שיודגם בהמשך. הדבר נובע מן הארכיטקטורה של הגרסה הנוכחית של שפת Bash.

בשביל להפעיל הזחה בהירדוק חייבים לכלול את התו מקף (-) בין הפתיח לבין שם ההירדוק כך (ללא רווח ביניהם):


```text
<<-EOT
```


ניתן להזיח הירדוק בתוך הירדוק בעזרת טאבים בלבד ולא ניתן להשתמש ברווחים כלל נכון לגרסה הנוכחית של שפת Bash).

התוצאה היא כך:


```text
<<-EOT0
cat <<EOT1
	Code...
	EOT1
EOT0
```


## מניעת הרחבת משתנים בתוך הירדוק
יש לעטוף את שם ההירדוק בגרשיים כפולים או בודדים אם רוצים למנוע הרחבת משתנים עם הרצת ההירדוק. התוצאה תהיה:


```text
<<"EOT"
```


היעדר השימוש בגרשיים כפולים או בודדים, ימנע הרחבה ויגרום לליטרליזציה (escaping) של המשתנים.

## שילוב בין מצבי הירדוק
ניתן להפעיל הזחה והחלפת פרמטרים יחדיו כך


```text
<<-EOT
```


דוגמה נוספת:


```text
bash /dev/fd/3 3<<-EOT0
	Command
	cat <<EOT1 >> /etc/apache2/apache2.conf
	Command
	EOT1
EOT0
```


## שימושים נוספים
ניתן להשתמש בהירדוק כהערה רבת שורות בתחביר Bash.

קטגוריה:תכנות