אנחנו נבחר ב Bash
נתחיל בחזרה קצרה על Bash והדברים שאפשר לעשות עם המעטפת באופן אינטרקטיבי. נזכור שסקריפט הוא בסך הכל רצף של פקודות, כל אחת מהן ניתן גם לרשום במעטפת האינטרקטיבית ולקבל את התוצאה באופן מיידי. נראה כעת כיצד להפעיל תוכניות חיצוניות ופקודות Bash פנימיות.
1. איך Shell Scripts שינו את שיטת העבודה שלי
אחד הקשיים הזכורים לי בתור מתכנת צעיר הוא עבודה עם סביבת העבודה, ובפרט עם בסיס הנתונים. המערכת מדי פעם היתה מכניסה נתונים לא נכונים לבסיס הנתונים והיה צריך להכנס ולנקות אותו (כלומר למחוק את הנתונים שהוכנסו בטעות). רצף הפעולות למחיקה היה די פשוט, אבל אם שכחת לבצע את אחת הפעולות התוצאות היו הרסניות. עם הזמן התחלתי להסתובב עם רשימות של הפעולות לביצוע בכל מצב.
עבודת הניקוי היתה חזרתית באופיה, כלומר אין לך בעייה לשמוע תוכנית רדיו או להתרכז בפעולה אחרת תוך כדי. היא לא היתה מעניינת אך גם לא קשה. באותו הזמן זה נראה לי חלק טבעי מהחיים בתור מתכנת. זה כמובן רחוק מהאמת.
מתכנתים טובים יודעים להשתמש בסביבת העבודה שלהם לטובתם. היום אני יודע שבאמצעות כתיבת סקריפט ניתן לקחת משימה החוזרת על עצמה ולקודד אותה כך שמחשב יוכל לבצעה שוב ושוב בזמן קצר מאוד ובלי לטעות. בין אם מדובר על ניקוי נתונים לא נכונים בבסיס הנתונים, יצירת טמפלייט לפרויקט חדש או העלאה של קבצים לשרת — כל משימה שאופיה חזרתי ניתן לקודד כסקריפט ולחסוך לעצמנו את הטירחה בלזכור מה צריך לעשות, וכמובן לחסוך זמן ביצוע. עם הזמן אנו כבר שוכחים מהם פרטי הפעולה וזוכרים רק כיצד להשתמש בסקריפט.
בקורס זה אנו נלמד כיצד לכתוב Shell Scripts שיעזרו לנו לבצע פעולות מורכבות בצורה פשוטה. כך, במקום לזכור רצפים ארוכים של פעולות ולהסתכן בטעויות, נוכל לייצר לעצמנו מאגר של Shell Scripts עבור פעולות אלו.
2. מהו Shell ומה ההבדל בין ה Shells השונים
ה Shell, או המעטפת בעברית, היא תוכנית מבוססת שורת פקודה המפעילה תוכניות אחרות ומתקשרת אתן. המעטפת מתפקדת כממשק משתמש מבוסס טקסט אל מכונת היוניקס.
קיימות הרבה תוכניות שונות שיכולות לתפקד בתור Shell, ולמעשה לכתוב תוכנית כזו היא משימה לא מורכבת: המעטפת קוראת שורת פקודה מהמשתמש, מפענחת את השורה ומבצעת אותה.
מעטפת היוניקס פותחה במקור בחברת AT&T and Bell Labs כדי להפריד בין התוכניות עצמן לבין אופן ההפעלה שלהן. כבר בתחילת הדרך משתמשי יוניקס יכלו לבחור באיזו מעטפת להשתמש, כאשר הראשונה נכתבה על ידי סטיב בורן ולכן נקראה Bourne Shell.
עם הזמן וההתפתחות של יוניקס הצטרפו תוכניות Shell נוספות למבחר: בשנות ה-70 פותחה C-Shell על ידי ביל ג׳וי (שלימים הקים את חברת Sun), בשנות ה-80 הצטרפה Korn Shell, פיתוחו של דייויד קורן, ובשנות ה-90 הצטרפה לחבורה Bash, מעטפת חופשית מבית פרויקט GNU.
כאשר לינוס טורוולדס בחר לשלב את הכלים של פרויקט GNU במערכת ההפעלה החדשה שהוא כתב, לינוקס, נכנסה Bash למרכז הבמה בתור מעטפת ברירת המחדל בכל המכונות שהריצו לינוקס. כיום היא מגיעה מותקנת מראש על כל מכונת לינוקס ומק, ומספקת יכולות טובות יותר מה Shells שקדמו לה.
לפני שנתחיל לכתוב סקריפטים ב Bash נרצה לענות על שתי שאלות: האחת, מתי נעדיף לכתוב Shell Script ומתי נעדיף לכתוב תוכנית רגילה, למשל בשפת C או פייתון; השנייה, למה לבחור דווקא ב Bash ולא במעטפת אחרת.
3. Bash לעומת תוכניות מעטפת אחרות
הזכרנו את Bourne Shell של סטיב בורן (מעטפת היוניקס הראשונה שפותחה). מעטפת זו עדיין נמצאת בתקן של יוניקס, ולכן כל מכונת יוניקס שתגיעו אליה כוללת מעטפת זו.
אם נרצה לכתוב Shell Script להתקנה של תוכנה עבור משתמשים אחרים במגוון מכונות נעדיף לבחור במעטפת זו.
המעטפת C-shell צברה פופולריות במהלך השנים מאחר והיא מאוד קלה ללמידה. יחד עם זאת יש מספר סיבות טובות להמנע מ C-shell עבור סקריפטים שנרצה להשתמש בהם לטווח הרחוק: היא אינה תומכת בפונקציות, אז תחזוקה ושימוש חוזר בקוד הם בעייתיים. סיבות נוספות מדוע תרצו להמנע מ C-shell ומוזרויות של מעטפת זו מומלץ לקרוא כאן: http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/
נשארנו עם K-shell ו Bash. שתיהן מעולות מבחינת היכולת לכתוב סקריפטים גדולים ולתחזק אותם, אך Bash נפוצה יותר מאחר והיא מעטפת ברירת המחדל במכונות לינוקס.
מסיבות אלו נבחר לכתוב את הסקריפטים שלנו ב Bash.
4. Shell Script לעומת שפות תכנות
השאלה המעניינת השניה היא האם לא עדיף לכתוב תוכנית רגילה למשל בשפת פייתון או פרל במקום סקריפט. התשובה היא כמובן תלוית מקרה. סקריפטים עושים עבודה מעולה כשמדובר בפעולות שהמעטפת יודעת לעשות טוב. הנה כמה דוגמאות:
- בסקריפט קל לנו מאוד ליצור תיקיות, ליצור קבצים, להעביר או להעתיק תיקיות וקבצים על אותה המכונה או בין מכונות שונות.
- בסקריפט קל לנו מאוד לחפש על פי מאפיינים של קבצים: סריקה של עץ תיקיות שלם ואיתור קבצים או תיקיות מתאימים, ואז ביצוע פעולה עליהן מתבצעת מאוד בקלות כסקריפט.
במהלך הקורס אנו נראה דוגמאות לשימושים מגוונים בסקריפטים, כאלה שכתיבת תוכנית מלאה עבורן היתה דורשת הרבה יותר קוד.
5. סקירה זריזה של המעטפת
נתחיל בחזרה קצרה על Bash והדברים שאפשר לעשות עם המעטפת באופן אינטרקטיבי. נזכור שסקריפט הוא בסך הכל רצף של פקודות, כל אחת מהן ניתן גם לרשום במעטפת האינטרקטיבית ולקבל את התוצאה באופן מיידי. נראה כעת כיצד להפעיל תוכניות חיצוניות ופקודות Bash פנימיות.
שורת פקודה המתחילה בשם של תוכנית, למשל echo, מפעילה את התוכנית החיצונית echo עם הפרמטרים שמועברים בהמשך שורת הפקודה. כך זה נראה (שימו לב שסימן ה-$ מייצג את שורת הפקודה, לכן כשאתם מקלידים את הטקסט אל תקלידו סימן זה):
$ echo hello bash
hello bash
תפקיד המעטפת לפענח את שורת הפקודה שרשמנו, לזהות ש echo הוא שם של תוכנית ולהעביר אליה את שני הארגומנטים שהעברנו בהמשך הפקודה. התוצאה היא כמובן הטקסט שחוזר אלינו: hello world. כעת נראה עוד כמה דברים שהמעטפת עושה בעת פענוח שורת הפקודה. נרשום את הפקודה:
$ echo Hello $USER you are using $0
Hello ynonperek you are using -bash
מה שקרה הוא שלפני הפעלת הפקודה echo, המעטפת זיהתה את סימן הדולר והבינה שהמילים 0 ו USER מתיחסות למשתנים. פענוח המשתנים בוצע לפני הפעלת פקודת ה echo והתוצאה היא הטקסט שמוצג לעיל. לסיום, ניתן להיעזר ב man או help כדי לקבל עזרה על פקודות שמעניינות אתכם. הראשונה תציג את עמוד התיעוד עבור תוכניות חיצוניות, והשניה עבור פקודות Bash פנימיות (שימו לב שסימן ה-# מייצג הערה, כלומר שורה שאין לה משמעות מבחינת התוכנית ורק מסייעת לנו להבנה):
# get help on an external program “ls”
$ man ls
# get help on an internal shell command “cd”
$ help cd
הפעלת תוכנית חיצונית ב Bash:
$ echo hello bash
hello bash
פענוח משתנים בשורת הפקודה:
$ echo Hello $USER you are using $0
Hello ynonperek you are using -bash
קבלת עזרה:
# get help on an external program “ls”
$ man ls
# get help on an internal shell command “cd”
$ help cd