שימושים בפקודה Exec ב-Shell Scripts

Symwsym Bpqwdh Exec B Shell Scripts



מדריך זה מרחיב את הפקודה exec והשימוש בה בסקריפטים של מעטפת.

דרישות קדם:

כדי לבצע את השלבים המודגמים במדריך זה, אתה זקוק לרכיבים הבאים:

  • מערכת לינוקס פונקציונלית. למידע נוסף על הגדרת Ubuntu VM באמצעות VirtualBox .
  • גישה לא משתמש שאינו שורש עם הרשאות sudo .
  • עורך טקסט מתאים. לדוגמה: למה / NeoVim , ננו , טקסט נשגב , VSCodium , וכו.

פיקוד ההנהלה

הפקודה exec אינה כלי נפרד בפני עצמו:







$ איזה exec



במקום זאת, זו פקודה פנימית של מעטפת ה-Bash:



$ איש exec





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



שימוש בסיסי

כברירת מחדל, בכל פעם שמריצים פקודה, Bash מולידה תת-שריון ומזלג את הפקודה.

$ הֵד $$ && לִישׁוֹן 999

$ pstree -עמ'

כאן, פקודת ההד מדפיסה את ה-PID של המעטפת הנוכחית. מעטפת Bash (PID: 978) מולידה תהליך ילד חדש לעבודה עם פקודת השינה (PID: 8369).

עכשיו, מה אם נריץ את פקודת השינה באמצעות exec?

$ הֵד $$ && exec לִישׁוֹן 999

$ pstree -p

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

סביבה נקייה

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

ראשית, השתמש בפקודה printenv כדי לרשום את כל משתני הסביבה המוגדרים כעת:

$ printenv

כעת, השתמש ב- exec כדי להפעיל מופע נקי:

$ exec לַחֲבוֹט

$ printenv

השקת מעטפת אחרת

מלבד Bash ו-'sh', ישנן עוד מספר תוכניות מעטפת זמינות, כל אחת עם ההטבות הייחודיות שלה. אם תוכנית/סקריפט דורשת מעטפת ספציפית, אתה יכול להשתמש ב-exec כדי להחליף את מעטפת Bash הנוכחית במעטפת הרצויה.

בדוגמה הבאה, אנו מחליפים את Bash ב-'sh':

$ pstree -עמ'

$ exec ש

$ pstree -עמ'

שימוש ב-Exec בסקריפטים

עם היסודות מחוץ לדרך, כעת נוכל להתחיל להשתמש ב-exec בסקריפטים של המעטפת שלנו.

דוגמה 1: עבודה עם קליפות שונות

בדוק את התסריט הבא:

#!/bin/bash

הֵד $SHELL

הֵד 'echo zsh הושק בהצלחה' > zsh.sh

exec זש zsh.sh

כאן, פקודת ההד הראשונה מדפיסה את המעטפת הנוכחית. כברירת מחדל, זה צריך להיות Bash. לאחר מכן, הפקודה exec מפעילה את 'zsh' כדי להפעיל את הסקריפט 'zsh.sh'.

הפעל את הסקריפט הבא:

$ . / test.sh

דוגמה 2: עקיפה של התהליך הקיים

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

בדוק את התסריט הבא:

#!/bin/bash

pstree -עמ'

exec pstree -עמ'

הֵד 'שלום עולם'

כאן, פקודת pstree הראשונה מציגה את הפריסה המקורית של עץ התהליך. לאחר ביצוע פקודת exec, פקודת pstree השנייה מחליפה את המעטפת הפועלת. פקודת ההד בשורה האחרונה לא בוצעה.

הפעל את הסקריפט הבא:

$ . / test.sh

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

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

דוגמה 3: רישום

מעטפת Bash מציעה 3 מתארי קבצים ייחודיים לכל תוכנית/סקריפט פועל:

  • STDOUT (1): פלט רגיל, מאחסן פלט רגיל
  • STDERR (2): שגיאה רגילה, מאחסן הודעות שגיאה
  • STDIN (0): קלט סטנדרטי

באמצעות exec, אנו יכולים להפנות את מתארי הקבצים הללו למיקום אחר, למשל: קבצי יומן. זה יכול לעזור עם איתור באגים ורישום באופן כללי.

באופן כללי, אם אתה רוצה להפנות מחדש את STDOUT ו-STDERR לקובץ יומן, אתה משתמש באופרטור ההפניה:

$ הֵד $$ | טי test.log

נזיר $ 2 >& 1 | טי test.log

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

#!/bin/bash

> test.log

exec 1 >> test.log

exec 2 >& 1

הֵד 'שלום עולם'

פקודה_שגויה

כאן, השורה הראשונה יוצרת קובץ יומן ריק. פקודת ה- exec הראשונה קובעת הפניה קבועה של STDOUT לקובץ היומן. פקודת ה-Exec השנייה מפנה מחדש את STDERR ל-STDOUT.

עם הגדרה זו, כל הפלטים והודעות השגיאה נזרקות לקובץ היומן:

$ . / test.sh

$ חתול test.log

מה אם הסקריפט יוצר ערכי יומן רציפים?

#!/bin/bash

> test.log

exec 1 >> test.log

exec 2 >& 1

בזמן נָכוֹן

לַעֲשׂוֹת

הֵד $RANDOM

לִישׁוֹן 5

בוצע

כאן, בחלק הראשון, אנו יוצרים הפניה קבועה של STDOUT ו-STDERR לקובץ היומן שלנו. לולאת ה-while האינסופית מפעילה את פקודת ההד עד שנסגור אותה בכוח באמצעות 'Ctrl + C'. המשתנה $RANDOM הוא משתנה מיוחד שמחזיר מחרוזת אקראית בכל פעם שניגשים אליו.

כדי לבדוק את ערך יומן העדכון, השתמש בפקודה הזנב הבאה:

$ זָנָב test.log

שים לב שהניתוב מחדש זה נמשך רק עבור הפעלת המעטפת.

דוגמה 4: קלט מקובץ

בדומה לאופן שבו יצרנו הפניה קבועה של STDOUT ו-STDERR, אנחנו יכולים גם ליצור אחד עבור STDIN. עם זאת, מכיוון ש-STDIN משמש לקלט, היישום הוא קצת שונה.

בסקריפט הבא, אנו לוקחים STDIN מקובץ:

#!/bin/bash

הֵד 'הד' שלום עולם '' > קֶלֶט

exec < קֶלֶט

לקרוא שורה 1

eval $line_1

כאן, בשורה הראשונה, אנו משתמשים בהד כדי ליצור את התוכן של קובץ input_string באמצעות ניתוב מחדש. הפקודה exec מפנה מחדש את התוכן של input_string ל-STDIN של הפעלת המעטפת הנוכחית. לאחר קריאת המחרוזת, אנו משתמשים ב-eval כדי להתייחס לתוכן של $line_1 כקוד מעטפת.

הפעל את הסקריפט הבא:

$ . / test.sh

סיכום

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

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

מחשוב שמח!