הירדוקיומנט

מתוך המכלול, האנציקלופדיה היהודית
קפיצה לניווט קפיצה לחיפוש

הירדוקיומנט או בקצרה הירדוקאנגלית: 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 שמפנה פלט בן מספר שורות לקובץ רגיל מסוים. דוגמת קוד תהיה זו:

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.

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

<<-EOT

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

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

<<-EOT0
cat <<EOT1
	Code...
	EOT1
EOT0

החלפת פרמטרים בתוך הירדוק

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

<<'EOT'

שילוב בין מצבי הירדוק

ניתן להפעיל הזחה והחלפת פרמטרים יחדיו כך

<<-'EOT'

דוגמה נוספת:

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

שימושים נוספים

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