מה זה Bash בעומק¶
רוב האנשים מכירים את Bash כ"החלון השחור עם הטקסט שבו מקלידים פקודות בלינוקס". וזה נכון, אבל זו רק קליפה דקה מעל משהו הרבה יותר מעניין. Bash הוא בעצם שני דברים בבת אחת - shell אינטראקטיבי, ושפת תכנות שלמה. הבנת ההבדל, ומה קורה בפועל כשאתם לוחצים Enter, פותחת דלת להבנה עמוקה בהרבה של לינוקס.
מה זה בעצם shell¶
shell הוא התוכנית שמתווכת בינכם לבין הקרנל של מערכת ההפעלה. כשאתם מקלידים פקודה, ה-shell הוא זה שקורא אותה, מבין מה אתם רוצים, ומריץ את התוכנית המתאימה. Bash - קיצור של Bourne Again SHell - הוא אחד ה-shells הנפוצים ביותר בעולם לינוקס, וברירת המחדל בהרבה הפצות.
מה קורה כשאתם מקלידים פקודה¶
השורה שאתם מקלידים לא נשלחת ישירות למערכת ההפעלה. היא עוברת תהליך פענוח שלם שנקרא parsing, שבו Bash מפרק אותה למילים, מזהה איזה חלק הוא שם הפקודה ואיזה חלק ארגומנטים, ומבצע כמה סוגי הרחבה - expansion - לפני שהוא בכלל מריץ משהו.
לדוגמה, אם תקלידו echo $HOME, Bash קודם מזהה שה-$HOME הוא משתנה, מחליף אותו בערך שלו - הנתיב לתיקיית הבית שלכם - ורק אז מריץ את echo עם הערך המוחלף. זה נקרא הרחבת משתנים - variable expansion.
סוגי הרחבה נוספים שקורים מאחורי הקלעים¶
- הרחבת נתיבים - globbing. כשאתם כותבים
*.txt, Bash מחליף את הכוכבית ברשימת קבצים אמיתיים מהתיקייה הנוכחית, לפני שהפקודה בכלל רואה אותם. - תת-פקודות - command substitution. התחביר
$(command)מריץ פקודה, ומחליף אותה בפלט שלה. לדוגמהecho "היום $(date)"ירוץ ראשית date, ורק אחר כך יריץ echo עם התוצאה. - הרחבת סוגריים מסולסלים - brace expansion.
file{1,2,3}.txtמתרחב ל-שלושה שמות קבצים נפרדים, שימושי ליצירת כמה קבצים או תיקיות במכה אחת.
Bash כשפת תכנות¶
מעבר לפרשנות פקודות בודדות, Bash הוא שפת תכנות מלאה עם משתנים, תנאים, לולאות, ופונקציות. סקריפט bash יכול לכלול לוגיקה מורכבת ממש כמו כל שפה אחרת:
זה מה שהופך את Bash לכלי כל כך חזק לאוטומציה - אותה שפה שבה אתם מקלידים פקודות בודדות בטרמינל, אפשר להרכיב לתסריטים שלמים שמבצעים משימות מורכבות אוטומטית.
מה זה subshell¶
כשאתם מריצים סקריפט, או פותחים סוגריים רגילים סביב פקודות ( command ), Bash יוצר תת-תהליך שנקרא subshell - עותק נפרד של ה-shell עם משתנים משלו. שינויים שקורים בתוך subshell לא משפיעים על ה-shell המקורי שממנו הוא נוצר. זה מסביר תופעה שמבלבלת מתחילים - למה משתנה ששיניתם בתוך סקריפט "נעלם" ברגע שהסקריפט הסתיים.
למה שווה להבין את זה ולא רק לשנן פקודות¶
מי שמבין איך Bash מפרש ומרחיב פקודות, מפסיק להיתקע על שגיאות מוזרות שקשורות למרכאות, רווחים, או תווים מיוחדים. במקום לשנן פתרונות בעל פה, אתם מבינים למה הפתרון עובד, ויכולים לפתור בעיות חדשות בעצמכם.
רוצים ללמוד את היסודות של לינוקס, כולל עבודה עם Bash מהבסיס ועד רמה מתקדמת? יש לנו קורס שלם וחינמי: קורס לינוקס בסיסי.
נתקלתם בהתנהגות מוזרה של Bash שלא הבנתם? שתפו אותנו ונפענח את זה יחד.