OnWorks Linux ו-Windows Online WorkStations

לוגו

אירוח מקוון בחינם עבור תחנות עבודה

<הקודם | תוכן | הבא>

החלפת התהליך

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

ראינו דוגמה לבעיית סביבת המשנה בפרק 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

בעלים: אני

קבוצה: אני


תמונה

מחשוב ענן מערכת ההפעלה המוביל ב-OnWorks: