החלפת התהליך
למרות שהם נראים דומים וניתן להשתמש בשניהם כדי לשלב זרמים לניתוב מחדש, יש הבדל חשוב בין פקודות קבוצתיות ותת-שריון. בעוד שפקודה קבוצתית מבצעת את כל הפקודות שלה במעטפת הנוכחית, תת-מעטפת (כפי שהשם מרמז) מבצעת את הפקודות שלה בעותק צאצא של המעטפת הנוכחית. המשמעות היא שהסביבה מועתקת וניתנת למופע חדש של המעטפת. כאשר תת-המעטפת יוצאת, העותק של הסביבה הולך לאיבוד, כך שכל השינויים שנעשו בסביבת המשנה (כולל הקצאת משתנה) יאבדו גם כן. לכן, ברוב המקרים, אלא אם כן סקריפט מצריך תת-מעטפת, פקודות קבוצתיות עדיפות על פני תת-מעטפת. פקודות קבוצתיות הן גם מהירות יותר וגם דורשות פחות זיכרון.
ראינו דוגמה לבעיית סביבת המשנה בפרק 28, כאשר גילינו כי א לקרוא הפקודה בצנרת אינה פועלת כפי שאנו עשויים לצפות באופן אינטואיטיבי. לסיכום, אם נבנה צינור כמו זה:
הד "פו" | קרא הד $REPLY
הד "פו" | קרא הד $REPLY
התוכן של תשובה המשתנה תמיד ריק מכיוון ש- לקרוא הפקודה מבוצעת בתת-מעטפת, והעותק שלה של תשובה נהרס כאשר תת-המעטפת מסתיימת.
מכיוון שפקודות ב-pipelines תמיד מבוצעות בתת-קונכיות, כל פקודה שמקצה משתנים תיתקל בבעיה זו. למרבה המזל, הקליפה מספקת צורה אקזוטית של התרחבות הנקראת החלפת תהליכים שניתן להשתמש בו כדי לעקוף את הבעיה הזו.
החלפת תהליך מתבטאת בשתי דרכים: עבור תהליכים המייצרים פלט סטנדרטי:
<(רשימה)
או, עבור תהליכים שצורכים קלט סטנדרטי:
>(רשימה)
איפה רשימה היא רשימה של פקודות.
כדי לפתור את הבעיה שלנו עם לקרוא, אנו יכולים להשתמש בהחלפת תהליכים כך:
קרא < <(echo "foo") echo $REPLY
קרא < <(echo "foo") echo $REPLY
החלפת תהליך מאפשרת לנו להתייחס לפלט של תת-מעטפת כקובץ רגיל למטרות הפנייה מחדש. למעשה, מכיוון שמדובר בצורת התרחבות, אנו יכולים לבחון את ערכה האמיתי:
[me@linuxbox ~]$ echo <(echo "foo")
/dev/fd/63
[me@linuxbox ~]$ echo <(echo "foo")
/dev/fd/63
על ידי שימוש הד כדי לראות את התוצאה של ההרחבה, אנו רואים שהפלט של המשנה מסופק על ידי קובץ בשם /dev/fd/63.
החלפת תהליך משמשת לעתים קרובות עם לולאות המכילות לקרוא. הנה דוגמה של א
לולאת קריאה המעבדת את התוכן של רישום ספריות שנוצר על ידי תת-מעטפת:
#! / bin / bash
# pro-sub: הדגמה של החלפת תהליך
בעת קריאת קישורי attr גודל קבוצת הבעלים תאריך שעה שם קובץ; לעשות חתול <<- EOF
שם הקובץ: $filename גודל: $size
בעלים: $owner
קבוצה: $group שונה: $date $time קישורים: $links תכונות: $attr
EOF
בוצע < <(ls -l | זנב -n +2)
#! / bin / bash
# pro-sub: הדגמה של החלפת תהליך
בעת קריאת קישורי attr גודל קבוצת הבעלים תאריך שעה שם קובץ; לעשות חתול <<- EOF
שם הקובץ: $filename גודל: $size
בעלים: $owner
קבוצה: $group שונה: $date $time קישורים: $links תכונות: $attr
EOF
בוצע < <(ls -l | זנב -n +2)
הלולאה מבוצעת לקרוא עבור כל שורה ברישום ספרייה. הרישום עצמו מופק בשורה האחרונה של התסריט. קו זה מפנה את הפלט של החלפת התהליך לקלט הסטנדרטי של הלולאה. ה זנב הפקודה כלולה בצינור החלפת התהליך כדי לבטל את השורה הראשונה של הרישום, שאינה נחוצה.
כאשר הוא מופעל, הסקריפט מייצר פלט כך:
[me@linuxbox ~]$ פרו-סאב | ראש -n 20
שם קובץ: addresses.ldif גודל: 14540
בעלים: אני
קבוצה: אני
Modified: 2009-04-02 11:12
[me@linuxbox ~]$ פרו-סאב | ראש -n 20
שם קובץ: addresses.ldif גודל: 14540
בעלים: אני
קבוצה: אני
Modified: 2009-04-02 11:12
קישורים:
1
קישורים:
תכונות: -rw-r--r--
שם הקובץ: bin
גודל: 4096
בעלים: אני
קבוצה: אני
Modified: 2009-07-10 07:31
קישורים: 2
תכונות: drwxr-xr-x
שם קובץ: bookmarks.html גודל: 394213
בעלים: אני
קבוצה: אני
תכונות: -rw-r--r--
שם הקובץ: bin
גודל: 4096
בעלים: אני
קבוצה: אני
Modified: 2009-07-10 07:31
קישורים: 2
תכונות: drwxr-xr-x
שם קובץ: bookmarks.html גודל: 394213
בעלים: אני
קבוצה: אני