הירדוקיומנט

הירדוקיומנט או בקצרה הירדוק (מאנגלית: 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 יש לעטוף את שם ההירדוק בגרשיים כפולים או בודדים אם רוצים למנוע הרחבת משתנים עם הרצת ההירדוק. התוצאה תהיה: <<"EOT" היעדר השימוש בגרשיים כפולים או בודדים, ימנע הרחבה ויגרום לליטרליזציה (escaping) של המשתנים. ניתן להפעיל הזחה והחלפת פרמטרים יחדיו כך <<-EOT דוגמה נוספת: bash /dev/fd/3 3<<-EOT0 Command cat <<EOT1 >> /etc/apache2/apache2.conf Command EOT1 EOT0 ניתן להשתמש בהירדוק כהערה רבת שורות בתחביר Bash. ערך זה הוא יתום, כלומר אין ערכים בוויקיפדיה שמקשרים אליו. אתם מוזמנים לתרום לוויקיפדיה ולקשר אליו מכמה מהערכים שמכילים את המונח "הירדוקיומנט".