כיצד לאתר באגים של סקריפט bash?

How Debug Bash Script




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

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







מהו הקליפה בלינוקס?

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



ב- Unix, יש שני פגזים עיקריים מעטפת בורן ו C מעטפת . לשני הסוגים הללו יש קטגוריות משנה שלהם. סוגים שונים של פגזי בורן הם קליפת קורן (קש), קליפת אלמקוויסט (אפר), שוב מעטפת בורן (באש), ו פגז Z (zsh) . יחד עם זאת, למעטפת C יש קטגוריות משנה משלה כמו C מעטפת (csh) ו מעטפת TENEX C (tcsh) . כפי שצוין לעיל, מכל הקליפות, באש (שוב מעט בורן) היא הקליפה הנפוצה ביותר ויוצאת מהקופסה בהפצות לינוקס רבות בגלל יעילותה וידידותיות למשתמש.



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





מהו סקריפט Shell:

כפי שלמדנו את הרעיון הבסיסי של מעטפת, כעת נעבור לקראת סקריפטים של קליפות. סקריפט המעטפת היא תוכנית מחשב המבצעת פקודות מרובות במעטפת המשמשת כמתורגמן לביצוע פונקציה מסוימת. כפי שנדון לעיל, ישנם 2 סוגים מסוימים של פגזים. עם זאת, מדריך זה מתמקד בקליפת Bourne Again (Bash).
אז מהו סקריפט bash? ב- Linux כל הפקודות bash מאוחסנות ב- /usr /bin ו /bin תיקיות. לדוגמה, בכל פעם שאתה מפעיל פקודה, bash מחפש אם היא קיימת בספרייה או לא. הפקודה תתבצע אם היא מוצאת בספריות אחרת נותנת שגיאה.

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



מהם באגים בסקריפטים bash:

בעת עבודה עם סקריפטים bash או עם כל שפות תכנות אחרות, אתה נתקל בשגיאות רבות. באג הוא שגיאה או תקלה בתוכנית שיכולה לגרום לתוכנית להתנהג בצורה לא נכונה.

לכל שפת תכנות יש הליך משלה לאיתור באגים; באופן דומה, ל- bash יש גם אפשרויות בנייה רבות לניפוי באגים של תוכנית מסוף.

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

כיצד לאתר באגים של סקריפט bash:

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

ישנם כלים שונים בלינוקס לאיתור באגים בקודים, למשל, GNU Debugger aka gdb. כלים כמו GDB מועילים לתכנות שפות המתאספות לכדי קבצים בינאריים. מכיוון שבש היא שפה מתפרשת פשוטה, אין צורך בכלים כבדים כדי לאתר אותה.

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

ובכן, הוספת טענות היא אחת הטכניקות המסורתיות הישנות. ישנם ערכות דגלים/אפשרויות זמינות ב- bash לניפוי באגים של סקריפט bash. ניתן להוסיף אפשרויות אלה יחד עם shebang בתסריטים או להוסיף אותן בעת ​​ביצוע התוכנית במסוף. הנושאים אותם אנו הולכים לעסוק מפורטים להלן:

  1. כיצד לאתר באגים בסקריפט על ידי הפעלת מילולית -v אוֹפְּצִיָה
  2. כיצד לאתר באגים בסקריפט באמצעות xtrace -x אוֹפְּצִיָה
  3. כיצד לאתר באגים בסקריפט באמצעות noexec -n אוֹפְּצִיָה
  4. כיצד לזהות את משתנים לא מוגדרים בעת איתור באגים של סקריפט bash
  5. כיצד לבצע איתור באגים ב- חלק ספציפי של כתב הבש
  6. כיצד לבצע איתור באגים בסקריפט bash באמצעות מַלכּוֹדֶת פקודה
  7. כיצד לאתר באגים של סקריפט bash על ידי ביטול קובץ גלובינג משתמש ב אוֹפְּצִיָה
  8. איך ל לְשַׁלֵב אפשרויות באגים לניפוי באגים של סקריפט מעטפת
  9. איך ל הפניה מחדש של דו'ח באגים לקובץ

אז בואו נבדוק טכניקות שונות בבאש לניפוי באגים של סקריפט bash:

1. כיצד לאתר באגים בסקריפט על -ידי הפעלת האפשרות verbose -v:

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

#! /bin/bash
זרק 'הזן מספר 1'
לקרואמספר 1
זרק 'הזן מספר 2'
לקרואמספר 2
אם [ '$ מספר 1' -גט '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 גדול יותר מספר 2'
אליף [ '$ מספר 1' -משווה '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 שווה למספר 2'
אַחֵר
זרק 'מספר 2 גדול יותר מספר 1'
לִהיוֹת

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

$סודומַתְאִיםלהתקין באתי

צור קובץ script bash באמצעות:

$באתיb_script.sh

אם אתה חדש בעורך Vim, אני ממליץ לך ללמוד כיצד להשתמש בעורך vim לפני שנמשיך.

כעת, בחזרה לתסריט, בצע את התסריט באמצעות -v אוֹפְּצִיָה:

$לַחֲבוֹט -vb_script.sh

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

#! / bin / bash -v

באופן דומה, ניתן להוסיף את הדגל המילולי גם בשורה הבאה של shebang באמצעות מַעֲרֶכֶת פקודה:

#! /bin/bash
מַעֲרֶכֶת -v

כל אחת מהשיטות שנדונו לעיל יכולה לאפשר מילוליות.

2 כיצד לאתר באגים בסקריפט באמצעות אפשרות xtrace -x:

עקבות ביצוע, הידועה גם בשם xtrace היא אופציית באגים חכמה ושימושית, במיוחד לאיתור שגיאות לוגיות. טעויות לוגיות קשורות בדרך כלל למשתנים ולפקודות. כדי לבדוק את מצב המשתנה במהלך ביצוע התסריט, אנו משתמשים ב -איקס אוֹפְּצִיָה. עכשיו שוב, הפעל את b_script.sh קובץ עם -איקס דֶגֶל:

$לַחֲבוֹט -איקסb_script.sh

הפלט מציג במפורש את הערך של כל משתנה במהלך תהליך הביצוע. שוב, ה -איקס ניתן להשתמש לצד shebang ואחרי קו shebang באמצעות הפקודה set. ה- xtrace שם את סימן + בכל שורת התסריט.

3 כיצד לאתר באגים בסקריפט באמצעות אפשרות noexec -n:

שגיאות תחביר הן אחת הסיבות העיקריות לבאגים. כדי לאתר באגים תחביר את תסריט bash, אנו משתמשים noexec מצב (ללא ביצוע). האפשרות המשמשת למצב noexec היא -ן. הוא יציג רק את שגיאות התחביר של הקוד במקום לבצע אותו. גישה הרבה יותר בטוחה לניפוי באגים בקוד. בואו להוציא לפועל b_script.sh שוב עם אוֹפְּצִיָה:

$לַחֲבוֹט b_script.sh

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

#! /bin/bash

זרק 'הזן מספר 1'
לקרואמספר 1
זרק 'הזן מספר 2'
לקרואמספר 2
אם [ '$ מספר 1' -גט '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 גדול יותר מספר 2'
אליף [ '$ מספר 1' -משווה '$ מספר 2' ]
#לאחר מכן
זרק 'מספר 1 שווה למספר 2'
אַחֵר
זרק 'מספר 2 גדול יותר מספר 1'
לִהיוֹת

אני מעיר לאחר מכן לאחר אליף . עכשיו, עם -n בצע b_script.sh תַסרִיט:

$לַחֲבוֹט b_script.sh

כצפוי, הוא זיהה בבירור את השגיאה והציג אותה במסוף.

4 כיצד לזהות את המשתנים הבלתי מוגדרים בעת איתור באגים בסקריפט bash:

שגיאת כתיב בעת כתיבת קוד היא דבר נפוץ. לעתים קרובות אתה מקליד טעות במשתנה, שאינו מאפשר לקוד לבצע. כדי לזהות שגיאה כזו, אנו משתמשים ב -u אוֹפְּצִיָה. בואו נשנה את הקוד שוב:

#! /bin/bash
זרק 'הזן מספר 1'
לקרואמספר 1
זרק 'הזן מספר 2'
לקרואמספר 2
אם [ '$ num1' -גט '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 גדול יותר מספר 2'
אליף [ '$ מספר 1' -משווה '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 שווה למספר 2'
אַחֵר
זרק 'מספר 2 גדול יותר מספר 1'
לִהיוֹת

בראשון אם הצהרה מותנית, שיניתי את שמו של מספר 1 משתנה ל מספר 1 . עַכשָׁיו מספר 1 הוא משתנה לא קבוע. עכשיו הפעל את הסקריפט:

$לַחֲבוֹט -ub_script.sh

הפלט זיהה ומציג במפורש את שם המשתנה שאינו מוגדר.

5. כיצד באגים את החלק הספציפי של סקריפט הבש:

מצב xtrace מעבד כל שורה של הקוד ונותן פלט. עם זאת, מציאת שגיאות בקוד גדול תהיה גוזלת זמן אם אנו כבר יודעים איזה חלק עלול לגרום לשגיאה. למרבה המזל, xtrace מאפשרת לך גם לאתר באגים בחלק מסוים של הקוד, אותו ניתן לבצע באמצעות מַעֲרֶכֶת פקודה. מקום set -x בתחילת החלק שצריך לאתר באגים ואז סט +x בסופו של דבר. לדוגמה, אני רוצה לאתר באגים באמירות המותנות של b_script.sh , כך שאצרף את כל ההצהרות המותנות set -x ו סט +x אפשרויות כפי שמוצג בקוד להלן:

#! /bin/bash
זרק 'הזן מספר 1'
לקרואמספר 1
זרק 'הזן מספר 2'
לקרואמספר 2
מַעֲרֶכֶת -איקס
אם [ 'מספר $' -גט '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 גדול יותר מספר 2'
אליף [ '$ מספר 1' -משווה '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 שווה למספר 2'
אַחֵר
זרק 'מספר 2 גדול יותר מספר 1'
לִהיוֹת
מַעֲרֶכֶת+ x

כעת, הפעל את הסקריפט באמצעות bash b_script.sh .

הפלט מבצע באגים רק בתנאים אם כמפורט.

6. כיצד לאתר באגים בסקריפט באמצעות הפקודה trap:

אם התסריט שלך מסובך, ישנן גם טכניקות מפורטות יותר לניקוי באגים. אחד מהם הוא ה מַלכּוֹדֶת פקודה. ה מַלכּוֹדֶת הפקודה תופסת את האותות ומבצעת פקודה כאשר מתרחש מצב ספציפי. הפקודה יכולה להיות אות או פונקציה. יצרתי תסריט אחר בשם sum_script.sh :

#! /bin/bash
מַלכּוֹדֶת 'הד' שורה $ {LINENO}: המספר הראשון הוא $ מספר 1, המספר השני הוא $ מספר 2 והסכום הוא $ סכום 'לנפות
זרק 'הזן מספר ראשון'
לקרואמספר 1
זרק 'הזן מספר שני'
לקרואמספר 2
סְכוּם= $[מספר 1 + מספר 2]
זרק 'הסכום הואסכום של $'

ה מַלכּוֹדֶת פקודה עם לנפות אות מציג את מצב המשתנים מספר 1 , מספר 2 ו סְכוּם לאחר ביצוע כל שורה כפי שמוצג בתמונת הפלט הבאה:

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

7. כיצד לאתר באגים של סקריפט bash על ידי ביטול גלובציה של קבצים באמצעות האפשרות -f:

גלוביית קבצים היא תהליך של מציאת הקבצים עם תווים כלליים, כלומר, * ו ? . במצבים רבים, אינך צריך להרחיב קבצים בעת איתור באגים. במקרים כאלה, אתה יכול לחסום את הגלובוב של הקבצים באמצעות אוֹפְּצִיָה. בואו נבין את זה עם תסריט fglobe_script.sh :

#! /bin/bash
זרק 'הצג את כל קבצי הטקסט.'
ls *.טקסט

הקוד לעיל יציג את כל קבצי הטקסט בספרייה הנוכחית, בצע:

$לַחֲבוֹטfglobe_script.sh

כדי לכבות את גלוביית הקבצים, השתמש ב אוֹפְּצִיָה:

$לַחֲבוֹט fglobe_script.sh

באופן דומה, אתה יכול להשתמש בו עם shebang ועם מַעֲרֶכֶת הפקודה גם כן:

#! /bin/bash
זרק 'הצג את כל קבצי הטקסט.'
ls *.טקסט
מַעֲרֶכֶת
זרק 'הצג את כל קבצי הטקסט'
ls *.טקסט
מַעֲרֶכֶת+f

עכשיו, רוץ bash fglobe_script.sh:

החלק המצורף עם set -f/set +f אפשרויות לא עיבדו פקודות עם תווים כלליים.

8. כיצד לשלב אפשרויות ניפוי באגים לתסריט של קליפת באגים:

אנו משתמשים רק באחת האפשרויות בטכניקות האיתור הנ'ל, אך אנו יכולים לשלב אפשרויות שונות להבנה טובה יותר. בואו ליישם -איקס ו -v אפשרויות ל sum_script.sh תַסרִיט. אני משתמש ב- sum_script.sh תַסרִיט.

#! /bin/bash
זרק 'הזן מספר ראשון'
לקרואמספר 1
זרק 'הזן מספר שני'
לקרואמספר 2
סְכוּם= $[מספר 1 + מספר 2]
זרק 'הסכום הואסכום של $'

כעת בצע:

$לַחֲבוֹט -xvsum_script.sh

שניהם -איקס ו -v הפלט משולב, כפי שמוצג בתמונת הפלט. באופן דומה, אנו יכולים גם לשלב את -u אפשרות עם מילת מפתח -v לאיתור שגיאות. אני מחליף את ה מספר 1 משתנה עם על אחד בשורה השישית של התסריט:

#! /bin/bash
הוא$ מספר 2וסְכוּםהואסכום של $' ' לנפות
זרק '
הזן מספר ראשון'
לקרוא את מספר 1
זרק '
הזן מספר שני'
לקרוא את מספר 2
סכום = $ [num + number2]
זרק '
הסְכוּםהואסכום של $'

כדי לצפות בפלט, הפעל את הפקודה המוזכרת להלן:

$לַחֲבוֹט -uvsum_script.sh

9. כיצד להפנות דו'ח באגים לקובץ:

שמירת דו'ח באגים של סקריפט bash לקובץ יכולה להיות שימושית במצבים רבים. זה קצת מסובך כי להפנות דו'ח באגים לקובץ; אנו משתמשים בכמה משתנים מיוחדים. בואו ליישם את זה b_script.sh קוד:

#! /bin/bash
מנהל 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
זרק 'הזן מספר 1'
לקרואמספר 1
זרק 'הזן מספר 2'
לקרואמספר 2
אם [ 'מספר $' -גט '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 גדול יותר מספר 2'
אליף [ '$ מספר 1' -משווה '$ מספר 2' ]
לאחר מכן
זרק 'מספר 1 שווה למספר 2'
אַחֵר
זרק 'מספר 2 גדול יותר מספר 1'
לִהיוֹת

בשורה השנייה של הקוד ניתן לראות שאנו מפנים את הפלט ל- a debug_report.log קובץ באמצעות מנהל פקודה עם מתאר קובץ 5 (FD5).

exec 5> debug_report.log: ה מנהל הפקודה מפנה את כל מה שקורה במעטפת לקובץ debug_report.log.

BASH_XTRACEFD = 5: זה משתנה bash מסוים ואינו ניתן לשימוש בשום מעטפת אחרת. יש להקצות לו מתאר קבצים תקף, ובש יכתוב את הפלט שחולץ אליו debug_report.log.

PS4 = '$ LINENO– ': זהו גם משתנה bash המשמש להדפסת מספר השורה בעת איתור באגים באמצעות מצב xtrace. ערך ברירת המחדל של PS4 הוא ה + סִימָן

התסריט הנ'ל יוצר קובץ יומן בשם debug_report.log, כדי לקרוא אותו, השתמש ב חתול פקודה:

סיכום:

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

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