>> [סמינר - צדפים יוניקס, סביבות]
[דאגלס קליין - אוניברסיטת הרווארד]
[זה CS50. - CS50.TV]
>> הנושא של היום הוא מעטפת יוניקס.
אני דאגלס קליין, מומחה, או לפחות סביר משתמשים המוסמכים, של הקליפה.
קליפה היא הממשק למשתמש של מערכת ההפעלה של המחשב.
השם הוא מטעה, כי בניגוד לקליפתו של בעל חיים,
וזה קשה ומגן, קליפת המחשב מאפשרת תקשורת.
אז קרום נקבובי כנראה יהיה מטאפורה טובה יותר.
>> הפגז המקורי ליוניקס הוא קליפת בורן.
בורן מאוית B-O-U-R-N-E.
בורן היה אחד הסופרים המקוריים של יוניקס,
וכן את הקליפה נקראת על שמו.
שמו של פגז שכפקודה הוא פשוט sh.
זה הפקודה שאתה יכול לבצע.
המעטפת מתחילה בכניסה.
כשאתה נכנסת למחשב, המעטפת פשוט מתחילה לרוץ בשבילך,
וזה מה שלוקח הפקודות שלך.
זה יכול להתחיל בזמנים אחרים גם.
אם אתם מביאים את חלון עם שום אינדיקציה אחרת, הוא יתחיל פגז בשבילך.
ככה זה הוא שאתה יכול ללכת לחלון ולהתחיל להקליד פקודות
וכן הלאה יש, למרות שאתה לא להיכנס לחלון זה.
בנוסף, אם אתה עושה את התחברות מרחוק,
לאחר מכן הוא יתחיל פגז במחשב המרוחק.
ואפשר להפעיל פקודות ללא מעטפת אינטראקטיבית.
זה יכול להיות בתוך הפעולה הנוכחית שלך,
וזה גם יכול להיות פעולה מרחוק.
אתה יכול לשלוח את הפקודה למחשב אחר,
הכולל מתחיל פגז שם.
למעשה, זה חייב לכלול מתחיל פגז יש
אפילו אם זה לא המטרה הסופית שלך.
כשמשהו מתחיל ככה, זה לא בהכרח להתחיל פגז חדש.
אם אתם מביאים את חלון חדש, אפשר לספר אותו כדי להעלות את העורך
או פקודה אחרת.
במקרה כזה, העורך יתחיל מהתחלה.
כאשר העורך מסתיים, החלון מסתיים.
זה קצת יוצא דופן, אבל אפשר לעשות את זה.
במקרים אלה, זה לא יהיה פגז.
כך שזה לא בהכרח המקרה שחלון או יישום כזה יביא את פגז.
>> Shell מנתח פקודות.
ניתוח משמעותה איתור האלמנטים השונים ולסיווגם.
בתוך הפקודה, את המחרוזת המלאה שאתה מקליד,
יהיו 1 או יותר פקודות בודדות להוצאת להורג.
גורמים אחרים יכולים להיות ויכוחים.
יכול להיות גם תווים מיוחדים המשפיעים על ביצוע פקודה.
הם יכולים לשלוח את הפלט למקום אחר מאשר המסך
אם הפקודה תהיה בדרך כלל לשלוח אותו אל המסך.
זה יכול להפנות את הקלט, זה יכול לעשות גם דברים אחרים.
ישנם סימנים שונים אחרים, תווים, וכן הלאה.
ניתוח כרוך באיתור ולפרש את הדברים האלה.
>> עכשיו אם אין יותר שאלות, וזה די סביר שכן אין יותר אנשים,
אנחנו נלך לדף הבא שלי כאן.
>> שאמרתי קודם לכן כי פגז בורן הוא הקליפה הראשונית.
יש גם אחרים.
אחת מהן הוא ה-C-הפגז. הפקודה היא csh.
C-shell שם הוא רק משחק מילות.
פגז זה הוצג בברקלי יוניקס באמצע 1970s.
ברקלי יוניקס היה אירוע מכונן בהתפתחותה של יוניקס.
זו הייתה מהפכה עצומה וכללה את כניסתה של קליפה זו.
הסיבה למחזה שעל מילות, C-shell,
הוא שיש C-shell כמה מאפיינים בזה אשר דומים בשפת C,
שקליפת בורן אין -
או שזה לא היה באותו זמן.
יש גם TC-הפגז.
זה מהווה קבוצה של C-shell.
יש לו תכונות נוספות, שרבים מהם הן שימושיים לשימוש אינטראקטיבי,
כגון לזכור פקודות במנגנון ההיסטוריה,
שאני אתאר מעט מאוחר יותר -
בצורה פשוטה, במתכונת עורך.
כמו כן, יש איגודים שייאפשרו לך להיקשר מחרוזת מפתח קצרה לפקודת ארוכה יותר.
אנחנו לא הולכים להיות להיכנס לזה היום.
יש לו כמה תכונות שאינן שימושיות לתכנות.
עם זאת, ה-C-הפגז לא משמש לעתים קרובות לתכנות פגז.
תוכניות מעטפת, אם אתה לא יודע כבר,
הן תוכניות שמורכבות ממאפייני פגז.
אתה יכול לרוץ אלה כתוכניות.
אתה כותב חבורה של פקודות מעטפת לקובץ ולהפעיל את הקובץ.
אתה לא צריך לקמפל אותו. זוהי שפה פרשנית.
ביטוי C-shell הוא עכשיו משמעי שכן הוא עשוי להתייחס רק לC-shell, csh המקורי,
או לכל C-הפגזים, כולל tcsh. זה קצת מעורפל.
>> פגז מאוחר יותר הוא קורן הפגז, ksh, על שמו של המתכנת, קורן.
מעטפת זו ניסתה לשלב בקליפה 1
היתרונות של ה-C-shell לשימוש אינטראקטיבי
ובורן לשלם לתכנות.
זה כבר נעשה שימוש כמעטפת אינטראקטיבית על ידי כמה אנשים - מיעוט.
מאוחר יותר אם כי, לא הייתה הקדמה אחרת, מעטפת Bash, bash,
שוב משחק מילות, לשלם בורן-שוב.
זה סיומת של פגז בורן. קורן קליפה היא גם. שניהם.
יש לו את אותה המטרות של הקליפה קורן של התמזגות של C-shell
והיתרונות של בורן הקליפה בקליפה 1.
רבים מהשיפורים של הפגז קורן כלולים גם בש.
Bash, לעומת זאת, יש לו יותר ולכן הוא עדיף.
בורן-שוב להפגיז והקליפה קורן נקראות פגזי בורן מהסוג
מאחר שהם כוללים מאפיינים של בורן הקליפה,
אשר עולה בקנה אחד במובנים מסוימים עם C-פגזים.
ישנם פגזים אחרים מלבד אלה, חלקם מיועדים לשימוש מוגבל,
אולי מוגבל לכמה פקודות, אולי למטרות מיוחדות, לא משמשות לעתים קרובות.
>> אוקיי. הפריט הבא כאן.
Bash הקליפה הפכה מזוהית עם צורות שונות של לינוקס.
אני לא בטוח אם זה נכון לגבי כל צורה.
ישנן צורות רבות שם בחוץ, ואני עדיין לא השתמשתי בכולם,
אבל באלה שהשתמשתי בו הפך הקשורים אליו.
אז עד כמה שאני יודע, אין שום דבר על Bash
מה שהופך את זה יותר תואם עם לינוקס
יותר מכל שילוב אחר של מערכת הפעלה פגז ו.
אני חושב שזה כנראה רק משקף את הנטיות של המתכנתים.
כי זה הפך להיות מזוהה עם לינוקס הוא סיבה נוספת להעדיף Bash לksh
מאז דברים עשויים להיות כתוב בזה וזה צפוי להתפשט.
אני אתן לך סיבות אחרות לכך בהמשך.
תסריטי פגז בורן צריכים לפעול תחת המעטפת קורן או Bash.
אם אתה כותב משהו לקליפת בורן,
כנראה שאתה יכול לבצע את זה תחת ksh או bash.
תסריטי פגז קורן כנראה יפעלו תחת Bash, אבל אני לא יכול להבטיח את זה.
בהמשך כאן, תסריטי C-shell צריכים לפעול תחת TC-הפגז.
C-shell למעשה מעולם לא השתמש בהרחבה עבור scripting
מאז בורן להפגיז ומאוחר יותר הפגזים בורן מהסוג עדיפים למטרה זו.
אז זה באמת לא כל כך חשוב.
יש די הרבה תסריטי פגז בורן שנכתבו לפני זמן רב,
לפני הקליפה קורן או פגז בורן-שוב הוכנסו.
אלה עדיין נמצאים בשימוש, חלק ממערכות ההפעלה,
וכך תוכל למצוא אותם, אם אתה מסתכל על מערכת ההפעלה
או כמה חבילות תכנות ישנות.
>> Bash הוא במידה מסוימת הופך סוג של לשון משותפת למערכות הפעלה.
זה כבר הורחב ל-Windows וVMS.
VMS, במקרה שאתה לא יודע, הוא מערכת הפעלה קניינית
של חברה לציוד דיגיטלי שהוא עדיין בשימוש, במידה רבה מאחורי הקלעים.
ואם זה הולך להיות פועל על מספר מערכות הפעלה שונות,
סביר להניח שאנשים נוטים לעבור על זה.
אבל התפתחות זו היא חדשה יחסית.
זה רק מתחיל, אז אני לא יכול לנבא אם זה יתברר באמת להיות סוג כזה של לשון משותפת.
כמו כן, משום שנתיבי קבצים וספריות שונים
בין מערכות הפעלה השונות אלה,
אתה לא יכול להיות מסוגל לכתוב תסריט Bash על מערכת הפעלה אחת
ולאחר מכן להפעיל אותו באחד אחר.
אתה צריך להיות מסוגל להעביר אותו בין יוניקס שונה, לינוקס
מערכות הפעלה Mac OS, אך לא בהכרח ל-Windows או VMS.
ייתכן שתצטרך לשנות את תיאור נתיב קובץ,
וכמה ספריות יכולות להיות שונות,
אשר עשוי להשפיע על האופן שבו חלק מפקודות עבודה
או איך הם מעבדים את הטיעונים וכדומה.
בנוסף לכך, זהירות אחרת כאן היא שאין כל ערובה
כי כל הפגזים השונים שהזכרתי - בורן המעטפת, C-shell,
TC-קליפה, קליפה קורן, בורן, שוב להפגיז - תהיה זמינה בשום יוניקס
או לינוקס או מחשב Mac OS.
הם פשוט לא יכולים להיות שם.
זו אחת האזהרות כאן.
זה מגבלה מצערת כאן מאז שהיית רוצה שדברים יעבדו בכל מקום,
אך למרבה הצער, אתה לא יכול לסמוך על זה.
>> אוקיי. הבא כאן.
נניח שאתה רוצה לכתוב תסריט מעטפת,
תכנית בהיקף של פקודות מעטפת.
אתה כותב פקודות שלך, לשים אותם בקובץ, ולהפעיל את הקובץ.
מה אם אתה רוצה לכלול את טיעונים?
במקרה של פעילות קליפה, טיעונים נקראים פרמטרים או פרמטרים positional
והם יהיו נקראים על ידי סימן דולר וספרה, $ 1, $ 2.
אז אם את התסריט יש בשם זה, הטיעון הראשון שלי יכול להיות טיעון 1
והשני שלי יכול להיות ויכוח 2,
ובתוך התסריט שלי אם אני רוצה להתייחס לדברים האלה -
בואו נמחקנו את זה מאז שאני לא באמת הולך להפעיל אותו -
בתוך התסריט שלי אני יכול להיות 1 $ ל מתייחס לARG1,
2 $, שייצאו ככה, arg2.
אז סימנים אלה זמינים כדי להתייחס לטענות,
ואלה חלים על כל של הפגזים.
בנוסף, יש דמויות אחרות.
* $ מתייחס לרשימת כל הטיעון, כל אחד מהם.
# $ מתייחס למספר הטענות.
שוב, זה חל על כל הפגזים.
סימנים אלו, ו* #, ניתן להשתמש בם עם אלה משמעויות במקומות אחרים גם.
אנחנו לא תהיינה להיכנס לזה.
>> שורה מציין Shell. מה זה?
נניח שכתבת תסריט וזה לקליפה מסוימת ואתה רוצה להפעיל אותו.
איך אתה יודע מה לשלם מערכת ההפעלה שלך תהיה להשתמש בו כדי להפעיל את התסריט שלך?
בשלב מסוים אתה יכול להניח שזה יהיה להפעיל אותו במעטפת בורן
אם לא יאמר אחרת,
אבל אנשים לא כותבים תסריטים בבורן לשלם כל כך הרבה יותר
ואתה אפילו לא יכול לסמוך על זה יותר.
אז הנה יש לנו קו מציין פגז ממש כאן.
המציין Bash.
שים לב שהוא מציין אותו בנתיב, / bin / bash.
אם מחשב יש מעטפת Bash אך לא בספריית bin, / bin, זה לא יעבוד.
זה מוקדמות אחרת, זהירות אחרת כאן.
קילו הסימן הוא דמות שורת ההערה.
שחל על כל הפגזים.
מקרה המסוים כאן, #! בתחילת תסריט, הוא מקרה מיוחד.
המציין את המעטפת שבו כדי להפעיל את התסריט.
כמו שאמרתי, זה לא יכול להיות באותו המקום / bin.
בנוסף, יש עוד דבר כאן.
אם אתה פשוט להשתמש בסולמית ללא סימן קריאה ונתיב,
כי צריך לציין C-פגז.
עם זאת, אני לא ממליץ לעשות את זה כי אני לא יכול להבטיח
שתמיד עובדים.
אם אתה רוצה C-shell, זה יהיה טוב יותר לומר זאת.
אז יש משהו מבלבל למדי כאן.
אם אתה משתמש בקו מציין פגז כמו / bin / bash
והקליפה שאינה זמינה שם,
אין שום דבר כמו / bin / bash במחשב מסוים כגון,
או בגלל שאין לו Bash או בגלל שהוא במיקום אחר,
אתה מקבל הודעת שגיאה אומרת לך שהתסריט שאתה רץ לא קיים.
וכמובן, התסריט שלך קיים, כך שהודעת השגיאה היא מבלבל.
הסיבה לכך שמערכת ההפעלה נותנת לך שגיאה כי
או, לייתר דיוק, שהמעטפת האינטראקטיבית שלך שבו אתה מפעיל זה נותנת שגיאה ש,
הוא שהוא מדווח על הפקודה שבה השתמש, המהווה את שמו של התסריט.
פקודה זו בצורה יעילה הנקראת קליפה על ידי השם של התסריט.
זה שבו אתה מקבל את זה הודעת שגיאה מבלבלת.
דרך נוספת לקרוא תסריט פגז
הוא על ידי ציון הפגז בשורת הפקודה, כמו כאן.
זו הפקודה. זה אומר להפעיל Bash ולאחר מכן להפעיל את התסריט שלי בש.
זה יהיה עדיף על פני קו מציין,
ואת זה יש לו את התכונה של ומאפשר לך לספק לנתיבים שונים.
אם אתה פשוט לתת פקודה, מערכת ההפעלה תחפש פקודה ש
במקומות שונים.
אם זה זמין, זה צריך למצוא אותו.
המחשב ימצא Bash כל מקום שהוא נמצא ולהפעיל אותו,
כך שאתה לא צריך אז להיות מודאג שבו הוא מוצא אותו.
ישנם חששות שעלולים להיות אחרים כאן,
כאילו יש יותר מגרסה 1 של בש, וזה אפשרי אם כי לא סביר.
אז זה בדרך אחרת להתמודד עם הדברים האלה.
קווים מציין יכולים להתקשר לכל פגז.
הם יכולים גם לקרוא לדברים אחרים מפגזים.
דוגמאות יש לי כאן sed, שהוא עורך הזרם;
awk, שהיא שפת עיבוד דפוס;
וPerl, שפת סקריפטים מאוד מפותחת.
אם אתה שם את קו מציין המציין אחד מאותם תוכניות בהתחלה,
זה ילך ישירות לתכנית שבמקום להתחיל פגז.
יש תוכניות אלה גבולות ליכולות שלהם.
פרל הוא מוכשר מאוד. סד הוא עורך. הוא יכול לעשות דברים שמעבר לפשטות עריכה.
אבל זה יכול להיות קשה לתכנית זו.
בנוסף, עוברים טיעונים ודברים לתסריט הוא בלתי אפשרי או מבלבל.
כך שבמקרים אלה, עם awk או sed, זה, לפחות מהניסיון שלי,
עדיף לכתוב awk תסריט ושיחת פגז או sed מתסריט הפגז
ולא קוראים awk sed או כקו מציין תסריט.
פרל הוא שפה מאוד מגוונת, כפי שאמרתי.
אתה לא יכול להפעיל פקודות אינטראקטיביות בPerl,
מה שאומר שאתה לא יכול לבדוק את החלקים של תסריטים שאתה מפתח
על ידי הפעלתם באופן אינטראקטיבי.
עם זאת, זה שפה מסוגלת מאוד
והתפתח לכלי בשימוש נרחב מאוד.
זה פשוט קצת הערת סוגריים על הקווים מציין.
>> ברוב הצורות של לינוקס או כל - שוב, אני לא יכול להיות בטוח שזה כל -
וב-Mac OS, אם אתה מקליד csh אתה מקבל tcsh,
ואם תקלידו sh אתה מקבל bash.
הם ניסו שם כדי לתת לך את הגרסאות מתקדמות יותר של פגזים אלה,
אבל זה יכול להיות מבלבל.
אם אתה כותב תסריט באמצעות tcsh או Bash כולל בשעה שקרא csh או sh
ולאחר מכן נסה להפעיל אותו במחשב שאין לי tcsh או בש,
אתה עלול לקבל כמה טעויות אם יש פקודות שם
שפגזים אלה אינכם מזהים.
בנוסף, ייתכן שנקראת הקליפה שלך במחשב המקומי
קורא לזה כמו sh או csh ולאחר מכן מקבל את הפגזים מתקדמים יותר.
אתה לא יכול אפילו לחשוב על העובדה שאתה משתמש במעטפת מתקדמת יותר.
אז זהו מכשול פוטנציאלי.
איך זה נקבע, כי אם תקליד sh אתה מקבל בש,
אם אתה מקליד csh אתה מקבל tsch?
יש דברים במחשבים אלה נקראים קישורים
אשר יכול להתחבר לשמות קבצים כדי להתייחס לאותו הדבר.
זה יכול להיות או 2 שמות לאותו קובץ או קבצים שמטרתם היא להפנות לקובץ אחר.
הם נקראים קישורים קשים וסמליים. אנחנו לא תהיינה להיכנס לזה יותר היום.
יתכן שיש גם קבצים נפרדים - sh קובץ 1, קובץ Bash 1 -
אבל שניהם מנוהלים על Bash.
אז יש במוקדמות אחרת כאן.
אם אתה מתקשר אחד הפגזים האלה בשם אחד,
אולי אתה חושב שאתה מקבל את אותה פונקציונלי כמו קורא לזה בשם אחר.
ובכן, זה ממש לא בהכרח נכון.
פקודות אלה יכולים לבחון את השם שבו הם נקראו
והם יכולים, על בסיס השם הזה, מתנהגים בצורה שונה.
ייתכנו בעיות של מנסה להתאים לסטנדרט.
חלק מכם אולי שמע על תקן POSIX זה או אחר,
אולי תכונות אחרות.
זו יכולה להיות מוגדר לעתים על ידי טיעוני שורת הפקודה
או על ידי הגדרת משתני פגז.
קורא לזה כמו sh או bash עשוי דווקא להוביל לביצוע שונה
גם אם זה אותו הקובץ שאתה מבצע.
דבר נוסף שיש לקחת בחשבון הוא שגם אם מחשב אחר יש Bash tcsh או,
אם הם אינם צמודים כפי שהם נמצאים במחשב המקומי שלך
אם יש לך מחשב מקומי של לינוקס או Mac OS,
אז שוב תקבל את הפגז שאתה קורא sh או csh, לא אחד שאולי אתה מעדיף.
יש בורן הפגז הנוכחי שיפורים פחותים מאלה בש
אבל בעבר אלה במעטפת בורן המקורית.
כתוצאה מכך, גם את קליפת בורן הנוכחית, sh,
גם כשזה לא בש, דומה לשפת C יותר מאשר ה-C-הפגז עושה.
זה לא היה נכון, כאשר C-shell נוצר לראשונה, אבל זה התפתח בצורה כזאת.
ייתכן שתבחין כאן שכל השמות הללו, פרט לפגז פגז בורן
יש להם משהו כדי לציין שקליפה שהם - csh, bash -
אבל פגז בורן הוא רק sh.
למה? זה היה הפגז המקורי.
זה היה פגז אז, לא קליפה,
ומאחר שזה היה הפגז, לא הייתה שום סיבה כדי להבדיל אותה מפגז נוסף.
אז בגלל זה יש לו את השם הזה ועדיין עושה.
>> עליון זה כאן הוא שורה ממסד נתוני סיסמא לחשבון שיש לי שם
במחשב אחר.
אני הולך לנסות להשיג את השם הזה כדי שתוכל לראות את החלק הזה בסוף, את הקליפה.
מסד הנתונים הסיסמה מחזיק מאפייני כניסה עבור כל המשתמשים.
בתחילת הוא שם המשתמש, שבו אתה יכול לראות את 2 האותיות האחרונות שלי עכשיו.
השדות כאן מופרדים על ידי נקודתיים.
השדה האחרון, כפי שאתה יכול לראות, הוא bin / tcsh, הפגז.
זה מציין פגז.
יש משהו מעניין כאן.
כאשר יוניקס פותח לראשונה, הייתה רק קליפה 1,
אז לא הייתה ברירה לשם.
אז למה הם לא מאפשרים שדה במסד נתוני הסיסמה כדי לציין פגז?
אני לא יודע, אבל זה מזל שהם עשו.
זה די קשה לבצע שינויים בפורמט מסד הנתונים סיסמא
בגלל תוכניות רבות מתייחסות לפורמט שלה
והיית צריך לכתוב אותו מחדש.
זה פיתוח מוצלח או מקרי שהם נכללו תחום זה.
זה סוג של קו קובץ סיסמות משמש בכל מחשבי יוניקס ולינוקס עד כמה שאני יודע.
יש מק מערכת משלה.
זה בעצם יש קובץ סיסמא עם הקווים בפורמט זה,
אבל זה לא שבו מאפייני המשתמשים מוגדרים.
עוד הערה בסוגריים לשם.
>> אם אתה מתקשר פגז, אתה יכול לקרוא לזה כמשנה פגז של הפגזים הקיימים שלך.
אז אם אני הולך כאן, בואו להיפטר מהדברים האלה.
הנה אני בC-הפגז.
משתנה זה, המזהה במדויק הקונכייה שלי,
הוא למעשה לא תמיד דרך אמינה לקבוע מה לשלם אתה מפעיל,
אבל במקרה הזה זה הוא.
מה אם אני פשוט להקליד -
עכשיו אני בש.
יש דברים שהולכים להיות אותו הדבר. ls אומר לי פקודות שלי.
אם אני עושה להשעות חזרה ל-C-הקונכייה שלי, ls, אותו הדבר. נכון?
FG, חזית, חזרה למעטפת Bash שלי.
מע"צ, ספרייה נוכחית, חזרה לC-הפגז.
ספריית מע"צ, שונה - בעצם לא ספרייה שונה במקרה זה.
זה אותו המדריך.
בואו נגיד שאני רוצה לקרוא לפקודה כאן: בי ls.
מה זה עושה?
זה אומר לי שבו פקודת ls,
אחד שנותן לי רישום בספרייה, ממוקם בls.
בואו נחזור לBash פגז. בואו ננסה את אותו דבר.
הממ, מעניין שם, שבו: הפקודה לא נמצאה.
מדוע זה כך?
שבו הפקודה בנויה לC-הפגז.
זה לא הפקודה שצריכה לקרוא לזיכרון ממקום אחר והוצאו להורג.
C-shell מפעיל אותו על ידי העברת ביצוע לחלק מקוד משלה
וזה לא במעטפת Bash.
אז בש, שאין לו פקודה כזו מובנה, מחפש אותו, לא מוצא את זה,
ואנחנו מקבלים הודעת שגיאה.
אז יש לנו מעטפת Bash פועלת תחת C-shell, ואנחנו קוראים לזה תת קליפה.
ורק במקרה שאתה סקרן, יש Bash פגז דרך של איתור פקודות משלו.
מקוצר ומתייחס לעובדה שזה יכול להיות מוצא להורג במהירות רב יותר,
שנמצא במהירות רבה יותר.
זה אחד השיפורים שנבנו בחלק מפגזים אלה.
>> פגזי בורן מהסוג עדיפים לתכנות.
יש להם מבני שליטה כמו לולאות, משפטי תנאי,
הסוג של פקודות שיהיה אפשר להשתמש בשפות תכנות כמו C
או כל שפה. אולי אתה מתכנת ב-Java או משהו כזה.
יש לי פגזים אותם מדי.
פגזי בורן מהסוג, במיוחד בש, יש להם יותר
והם נועדו עם גמישות רבה יותר.
יש Bash פגז מערכים. בורן המעטפת המקורית לא עושה זאת.
כך שיכול להיות משמעותי יתרון לתכנות.
C-shell דווקא יש לי מערכים אך אין לו הרבה תכונות אחרות אלה.
פגזי בורן מהסוג יבצעו מהר יותר
אם אין להם את התכונות שנועדו לשימוש אינטראקטיבי.
אתה טוען את דברים למטרה אחת, זה טוען אותם למטרה אחרת.
יש שתחלופה שם.
תכונות אלה המיועדים לשימוש אינטראקטיבי
באמת שימוש מועט, אם בכלל עבור scripting.
זה אפשרי להשתמש בתת קליפה אינטראקטיבית בדיוק כמו אחד שהתחלתי שם
כדי לבדוק את הפקודות שבו אתה מתכוון להשתמש בתסריט.
זה מה שאתה לא יכול לעשות עם פרל. אתה יכול לעשות את זה עם פצצות.
אפילו מבנים כמו ללולאות וכן הלאה ניתן להפעיל באופן אינטראקטיבי.
הם מדי פעם שימושיים לפעולה אינטראקטיבית,
אבל יותר סביר להניח שאתה משתמש בהם כדי לפתח את תסריט.
>> כינויים.
זה הולך להיות על ה-C-הפגז.
מנגנון ההיסטוריה שבו אתה מקבל בחזרה לפקודות מוקדם יותר
או חלקים מהם, כי יש לך כבר לרוץ.
שוב, על ה-C-הקליפה, קליפת בורן והקליפה קורן יש את הדברים האלה,
אבל אני לא הולך להיכנס אליהם.
אז הנה כמה כינויים שימושיים שיש לי.
במקום להקליד ls - זה פיקוד משותף -
פשוט להקליד ליטר ולחסוך לעצמך את דמות 1.
ls עם אפשרויות שונות, את כל עבודתם.
שים לב שיש הגדרות אלה ציטוטים סביבם.
במקרים אלה, הציטוטים אינם נחוצים.
אם אתה יכול להגדיר את הכינויים האלה בלי המרכאות, זה עדיין עובד.
הם מומלצים.
ישנם מצבים שבהם אתה לא יכול להשתמש בציטוט
בגלל שאתה רוצה שתקרה משהו שהציטוט הייתי למנוע.
לפעמים אתה יכול לצטט חלק מההגדרה, אך לא את כולו.
זה גם בדרך כלל מומלץ להשתמש בגרשיים בודדים ולא במרכאות כפולות.
יש מרכאות כפולות השפעות על הגדרות משתנה,
במיוחד שגרם להם להיות מוערך ולא לעצור אותו.
למה שנרצה להפסיק את ההערכה?
ואיך ציטוטים עושים את זה בשבילנו?
>> הנה פקודה שבו אתה עלול למצוא מעניין.
'* G ls'
* גרם, כפי שאתה בוודאי יודע, הוא ביטוי כללי
לכל שמות הקבצים מתחילים עם g.
אם אני רק כותב ב* גרם ls הפקודה, אני אקבל רשימה של כל השמות הללו בספרייה הנוכחית שלי.
אם אני מגדיר את הכינוי שכפי שהוא כאן עם הציטוטים,
זה יפעל הפקודה שבספרייה הנוכחית שלך שבו אתה מפעיל אותו.
אבל אם אתה מפעיל את הגדרת הכינוי בלי המרכאות,
זה יהיה להעריך את * g הכללי כשהוא פועל פקודת ההגדרה זו.
אז ההגדרה של הכינוי יהיה ls ואחריו הרשימה של קבצים בספרייה
שבפקודת הכינוי מבוצעת,
לא משנה היכן אתה בעצם מתכוון להריץ את הפקודה.
זה לא שימוש רב, והגרשיים בודדים למנוע את ההערכה של הכוכבית.
אז אתה פשוט מקבל את גר ls ההוויה הגדרה *.
ואז, כאשר אתה מפעיל את הכינוי, LGS, אז זה מכניס את זה.
עכשיו אין ציטוטים, וזה יהיה להעריך את הכוכבית כשאתה מפעיל את פקודת הכינוי.
אז זה דבר אחד.
מרכאות כפולות היו כי אותו אפקט כאן,
אבל יש מקרים אחרים בהם במרכאות כפולות לא היו עובדים כל כך טובה.
>> הנה עוד אחד.
אתה אולי יודע את פקודת grep.
פקודת grep ניתן להשתמש כדי לסרוק את קובץ לקווים שיש להם מחרוזות מסוימות.
אז בואו נלך לכאן ואני לצאת מקליפת בורן שלי.
אוקיי. הנה קובץ.
בואו נגיד שזה מחרוזות abc grep. זה מה שיש.
אם אני עושה zddd grep, אני לא מקבל כלום. אוקיי.
אז הוא מוצא את מחרוזת, הוא מדווח, זה לא מוצא, זה לא לדווח על כך.
זה פלטי כל קו שבו יש מחרוזת שעל זה.
יש כל מיני אפשרויות כאן שבו אתה יכול למצוא בתיעוד.
הנה דרך אחת לעשות את זה.
ומה עם אחד, כינוי grabc 'grep abc' הזה?
זה הולך כולל טיעון 1 כאשר הכינוי מוגדר.
אז אם אני עושה את זה כאן, עכשיו, אם אני עושה grabc,
עכשיו הכינוי כולל יותר מ פקודה הפשוטה. כמו כן, יש הוויכוח.
עד כה זה עובד.
יש לי פקודה אחרת כאן, זה אחד, ולכן אלה הם מחרוזות שונות לשם
ולהראות שזה לא ימצא שם שום דבר שכן הוא אינו תואם.
>> מה אם אני רוצה לכלול בהגדרת הכינוי את הקובץ שאני הולך לחפש
ואני רוצה לתת כטיעון לכינוי המחרוזת שאני מחפש?
אולי אני רוצה לומר abc כטיעון לכינוי שלי,
אבל הכינוי כבר קבע את הקובץ.
וזה מקום שבי ביטוי זה נכנס
שים לב יש לנו כאן grep בדיוק כמו קודם.
יש לנו את הקובץ כאן, מחרוזות.
\! ^, סוג של הבעה מוזרה, אני מניח, אם לא ראיתי את זה קודם.
סימן קריאה היא חלק ממנגנון ההיסטוריה C-הפגז.
זה יכול להיזכר בפקודות קודם לכן, זה יכול להיזכר בטיעונים לפקודות אלו וכן הלאה.
מנגנון ההיסטוריה משמש כחלק מכינוי.
אם תציין בתור אחרי סימן הקריאה, הוא מתייחס לאותו קו ברשימת ההיסטוריה,
שבו אנחנו לא נכנסים עכשיו מכיוון שזה נושא אחר לגמרי.
ניתן לציין חלק מקו.
אז! 03:02 יהיו הטיעון השני של פקודת מספר 3.
קארה כאן בביטוי זה מייצגת את הטענה הראשונה.
אם אתה לא נותן לו אינדיקציה לאיזו פקודה שאתה מתייחס אליו,
הוא מתייחס לפקודה באופן מיידי הקודמת,
וקארה היא סמל לטענה הראשונה.
כי זה הסימן הכניסה ולא את המספר, אתה לא צריך להשתמש במעי הגס,
כל כך! ^ אומר הטענה הראשונה לפקודה הקודמת.
קצת התבלבלו כאן.
במקרה זה, כאשר אתה משתמש בזה כהגדרת כינוי,
התייחסות ההיסטוריה מתייחסת בחזרה לפקודות שבו נעשה שימוש בכינוי.
אז זה הולך אחורה פקודת 1 כמבצע היסטוריה,
אלא כפעולת כינוי זה מתייחס לפקודה שבו היית הקלדה,
אומר, grstrings_file.
יש לנו את הציטוטים כאן בזה. מה הקו הנטוי ההפוך ל?
במקרה זה, כמו במקומות אחרים, אנחנו לא רוצים להוציא לפועל את מנגנון ההיסטוריה
תוך הגדרת הכינוי.
אם לא היה לנו את הקו הנטוי שם, הפגז היה למשוך בטענה הראשונה
של את הפקודה נכונה לפני שהוא רץ פקודת הכינוי הזה, שאנחנו לא רוצים.
אנחנו רוצים שזה ייבנה לפקודת הכינוי להתקשר בטיעון מאוחר יותר.
גרשיים בודדים לא לברוח סימן קריאה, התייחסות להיסטוריה.
אולי אתה יודע את בריחת ביטוי פירושו לשנות את המשמעות של משהו.
במקרה זה, זה אומר להפסיק משהו שיש משמעות מיוחדת.
המשמעות המיוחדת של סימן הקריאה היא ההיסטוריה.
לברוח ואין לו משמעות.
ציטוטים לא עושים את זה; קו נטוי הפוך עושה.
אז אנחנו משתמשים למעשה 2 רמות של בריחה כאן.
אני הולך להעביר פקודה זו לתוך החלון האחר מבלי להקליד אותו
באמצעות פעולות עריכה אלה, שבו אתה עלול למצוא שימושי.
משהו אחר כאן אני אראה לך.
אם אתה פשוט הקלד את הכינוי בלי ויכוחים, זה אומר לך את כל הטיעונים שלך.
זוהי חבורה של כינויים כבר הייתה לי כאן
מלבד אלה שכבר משתמשים כאן היום.
אבל אם אני פשוט להקליד את השם של כינוי, זה אומר לי מה זה אומר.
שים לב שהציטוטים נעלמו והקו הנטוי ההפוך הוא נעלם.
מחרוזת זו כאן היא התוצאה של שהגדרת הכינוי,
ועכשיו יש לו רק! ^ בו.
זה הולך להיראות במחרוזות קובץ לכל דבר.
אז אם אני עושה מחרוזות grstrings_file, אני לא נותן לו מה לחפש שם,
אבל זה נראה במחרוזות.
זה לא מצא מילת המחרוזות במחרוזות הקובץ, אבל זה abc למצוא.
וזה לא מוצא את זה.
אז הנה אנחנו נותנים טיעון שפוגע בהגדרה של הכינוי,
שהוכנס לתוכו.
זה מקום שבו ביטוי זה בא.
אתה יכול להשתמש יותר מ 1.
קארה היא סמל לטענה הראשונה.
אם אתה רוצה להשתמש בטיעון שני, היית אז אומר: 2.
אין שום סמל מיוחד לטענה השנייה.
ומכיוון שאתה משתמש בספרה, היית צריך להשתמש במעי הגס.
יש, עם זאת, בחירה אחרת כאן.
סימן הדולר מייצג את הטענה האחרונה.
ובגלל זה הוא סמל, ניתן להשמיט את המעי הגס.
אז זה יהיה הטיעון האחרון ברשימה.
ויש גם את זה.
כוכבית אומרת כל, אז זה רשימת טיעון המלאה,
ושוב, אתה יכול להשמיט את המעי הגס כי זה לא ספרה.
אני מקווה שאתה כל התבוננות בכל זה.
>> מנגנון ההיסטוריה יכול לחזור לקווים קודם לכן ברשימת ההיסטוריה.
אתה יכול לעשות את זה בהגדרת כינוי.
אף פעם לא ראיתי את זה נעשה.
תהיה לה ההשפעה של משיכת פקודות מוקדם יותר מרשימת ההיסטוריה
כאשר אתה לבצע את הכינוי, שיכולים להיות פקודות שונות
תלוי מתי ואיפה אתה לבצע את זה.
מתקבל על הדעת שאולי תרצה לשלוף התייחסות כזו
רק כדי לדעת מה הפקודה קודמת הייתה.
אף פעם לא ראיתי את זה קורה.
אני מניח שמישהו שירצה, אבל זה מאוד לא סביר.
יש עוד דבר כאן.
אם אתה משתמש שבהתייחסות ההיסטוריה מהסוג,
אז רק לטיעונים שיש בו התייחסות כזו נמצאים בשימוש.
אם יש לך הגדרת כינוי שאינו משתמשת בהתייחסות ההיסטוריה מסוג,
אם זה רק הופך להיות ההתחלה של הפקודה
ויש לך טיעונים נוספים, אז כל דבר שאתה מקליד לאחר ש
יתווסף לפקודה.
במקרה זה, למשל אני פשוט נתתי שם, השתמשנו בטיעון הראשון;
אנו לא משתמשים בכל האחרים.
אם טיעונים אחרים שניתנו בשורת הפקודה, הם לא היו בשימוש.
אז אם אתה משתמש בהתייחסות להיסטוריה בכל, אז אתה חייב להשתמש בו כדי לקבל את כל ויכוח.
>> יש עוד דבר שכאן אני רק רוצה להזכיר, בין השאר במאמר מוסגר,
דהיינו, כי מנגנון ההיסטוריה הזאת עם סימן הקריאה
חוזר לC-shell המקורי.
Tcsh הציג פעולות היסטוריה
המשתמשים במיני פקודות ומחרוזות מהעורכים,
או Emacs או vi.
דעתי האישית היא Emacs הוא הרבה יותר קל להשתמש למטרה זו
גם אם אתה משתמש vi לעריכה הרגילה שלך.
ישנן פקודות Emacs שונות אשר נמצאים כעת מותאמות להיסטוריה.
שליטת P מקבל את השורה הקודמת ברשימת ההיסטוריה.
נוסף בקרת P יקבל את אחד לפני כן.
החצים למעלה עושים את אותו הדבר.
בקרת N מקבל את הפקודה הבאה, אם כבר יש לך לגלול אחורה כמה דרכים.
החץ למטה עושה גם את זה.
move אתה יכול שמאל לימין עם החצים ועוד דברים שונים.
זה יכול להפוך את השימוש במנגנון ההיסטוריה
הרבה יותר קל מאשר שימוש בתחביר הסימן קריאה,
אבל אתה לא להשתמש בזה בהגדרת כינוי.
נלך על זה בפעם אחרת.
>> משתנים.
אתה יודע מה משתנה בשפות תכנות.
הפגזים גם יש להם.
C-הפגז משתמש בפקודה נקבעה להקצות משתנה,
כך קובע משתנה לשווי ב -
כמו שאמרתי, הגדרה חסרת תועלת, אבל איור של איך זה משמש.
פקודת הסט תיצור משתנה אם הוא לא קיימת כבר.
הפרמטרים positional לתסריטי מעטפת יכולים להיחשב משתנים,
אבל השימוש שלהם ואת הכללים עבורם הם שונים במקצת.
אתה לא יכול להקצות ערך ל -1 דולרים בקורס של תסריט.
היית צריך להגדיר משתנה חדש למטרה זו, אם כמה מכם רוצה.
הקלד להגדיר ללא ויכוחים ואתה מקבל רשימה של כל המשתנים שהוגדרו ברגע זה.
ובואו נגמור למעטפת אחרת שלי כאן ולראות מה אנחנו מקבלים אם אנחנו עושים את זה.
די רשימה ארוכה שם, נכון?
לגלול מעלה קצת. תסתכל על כל זה.
חלק מהדברים האלה מוגדרים באופן אוטומטי על ידי הפגז.
הקליפה יוצרת משתנה ומעניקה לו ערך.
חלקם מוגדרים על ידי הפגז אבל אז הגדיר מחדש על ידי המשתמש
בהתאם להעדפותיו.
וכמה מהם נוצרו על ידי המשתמש בהתאם למה שהוא עושה באותו היום.
זה פשוט להגדיר ללא ויכוחים.
יש תכונה מוזרה כאן של הדבר הזה.
שם צריך להיות גם ללא רווחים בין סימן השווה והשם המשתנה
והערך או החללים משני הצדדים של סימן השוויון,
כמו בזה.
זה לא יעבוד, וזה בעצם הוא פקודה חוקית
אבל זה לא יעשה את מה שאתה מתכוון.
הפקודה שתעבוד כי אם אתה רק אומר להגדיר ושם משתנה
ללא סימן שוויון או להגדיר ושם משתנה עם סימן שוויון ואין לו ערך,
זה יהיה להגדיר את המשתנה לערך ריק.
אז להגדיר = הוא פקודה חוקית.
פקודת הסט יכולה להגדיר יותר ממשתנה 1 על אותו הקו.
אז פקודה זו כאן יש ההשפעה של הגדרה הן A ו-B ל null ערכים.
כנראה שלא מה שאתה רוצה.
זה כאן, שהוזכר קודם לכן, יוביל לשגיאה
בגלל = b היא לא ביטוי חוקי.
שם משתנה לא יכול להתחיל עם סימן השוויון.
ויש את הדברים האלה עוד יותר כאן.
נקודתיים שימשו כדי לבחור טיעונים מהקווים ההיסטוריה,
והם יכולים לשמש - ואני לא נכנסתי לפני כן - לשנות את הדברים האלה.
הם גם יכולים לשמש כדי לשנות את משתני פגז.
זה כאן, $, יש לו ערך.
: R ימריא להארכה.
סיומת תהיה דבר הבא נקודה,
נקודה וכל דבר הבא זה בסוף קובץ,
רק בסוף הרשימה אחרי הלוכסן האחרון.
אז יש לי את זה כאן.
הוא ש. זה יירד. O.
אם אין הרחבה, רק הנתיבים אחרי הלוכסן שעבר, לא יהיה לה השפעה.
: h, שביטוי משתנה, ימריא לאלמנט האחרון של רשימת ספריות,
שוב, רק לאחר הלוכסן האחרון.
אז / / b / ג הופך / / b,
אבל זה משתנה בגלל האלמנט לאחר שהרשימה הוא ריק.
כאן יש משהו שגם אני רוצה להדגיש.
מוקדמות אלה אינם לחפש את קיומם של קבצים אלה.
הם פשוט מחפשים מחרוזות.
אלה נועדו כדי לתפעל שמות קבצים, נתיבים,
אבל הם יכולים להיות בשימוש בכל מחרוזת גם אם זה לא שם קובץ.
והם לא נראים לקיומו,
כך שאם אין קובץ כזה, / / ​​B / C, זה עדיין עובד.
בין אם זה על כל שימוש זו כבר שאלה אחרת, אבל זה עדיין יעבוד.
משתנים שונים בפגזי בורן. עוד נגיע לכך בהמשך.
דולר סימן ניתן נמלט בדיוק כמו סימן הקריאה וכוכבי.
דולר סימן ניתן נמלט עם קו נטוי או מרכאות בודדות.
יש מרכאות כפולות אפקט המוזר בכל הפגזים
לאלץ את ההערכה של דולר לחתום ביטוי משתנה.
אז אם זה להיות נמלט לכיוון אחד, במרכאות כפולות יכולות להיות ההשפעה
של גורם לו להיות מוערכים בכל מקרה.
זה קצת מבלבל.
אם יש מספר רמות של בריחה, כגון גרשיים בודדים בתוך מרכאות כפולות
או במרכאות כפולות בתוך גרשיים בודדים, אתה צריך לבדוק כדי לראות מה יקרה
למשתנה אם אתה משתמש באחד.
אלה 2 מצבים - בתוך כפול של בתוך אחד, אחד של דו -
לא נותן לך בהכרח את אותה התוצאה.
משתני סביבה, משתני C-shell כבולות.
משתני סביבה הם גם משתנים בC-shell,
והם גם משתנים בפגזים אחרים.
בC-shell, הם קבוצות שונות.
הדברים שאמרתי לפני כ משתני פגז.
משתני סביבה הם קבוצה מובהקת של משתנים
למעט מספר משתנה שאנו מכנים משתנים קשורים,
שהם מאוד חשובים ואנחנו נגיע אליהם מאוחר יותר.
משתני סביבה הם עברו באופן אוטומטי על
לפגזים או פקודות שמנוהלות מהפגז שלך.
הדברים האחרים לא. משתני המעטפת, הכינויים לא. משתני סביבה הם.
זו הסיבה שאנו קוראים להם משתני סביבה,
הרעיון הוא שהסביבה משתרעת על פני פשוט הפגז הנוכחי שלך.
הם יכולים לשמש כדי להגדיר דברים לפקודות.
הנה דוגמא. מדפסת, LPDEST.
שני משתנים אלו יכולים להגדיר מדפסת שפקודה תהיה להשתמש בו כדי להדפיס דברים.
אם יש לך מדפסות מרובות מסביב, אולי כדאי לך לשים את אחד שאתה אוהב.
הסיבה שיש לנו 2 משתנה היא שקבוצות שונות של פקודות שנכתבו
שימוש במשתנים שונים.
אתה יכול לתת להם ערכים שונים.
סביר להניח שאתה תיתן להם גם את אותו ערך.
הדברים האלה עובדים, כי הפקודות שעושות הדפסה
תוכנתו לבחון את הערכים של המשתנים הללו.
אם תכנית לא נכתבה ככה, אם זה נכתב כדי לעשות משהו אחר,
משתנה לא יהיה רלוונטי.
אז מערכת ההפעלה היא לא מחפשת משתנה אלה
כל פעם שאתה מתייחס למדפסת.
הפקודה שעושה הדפסה מחפשת משתנים אלה אם הוא מתוכנת ככה.
משתנה אלו לעתים קרובות מוגדרים בקבצי האתחול שלך
אבל לא בהכרח.
אתה יכול להגדיר אותם בשורת הפקודה.
הם עשויים להיות מוגדרים בפקודה.
הפקודה שמפעילה משהו שאולי יש מבחר של משתנים משלו -
משתנים שהנם ייחודיים לחבילת תוכנה מסוימת, למשל.
הם יוגדרו כשאתה מפעיל את החבילה.
כיצד משתנה אלה מועברים למשנה פגז?
כאשר תת קליפה כתובה, זה לא לכתוב לאזור זה.
האזור של תת הקליפה שמוקדשת למשתני סביבה
הוא לא נכתב על ידי משנה הפגז; זה שנכתב על ידי העתקה.
כאשר אתה מפעיל את הפקודה רגילה, כגון פקודות הבאות כדי להדפיס או כל דבר אחר,
הם מתחילים על ידי יצירת מעטפת חדשה.
הקליפה יוצרת מעטפת ולאחר מכן מחליפה חלק ממנה
עם הפקודה שאתה מפעיל, וזה קצת מבלבל,
אבל ככה פקודות אלה לקבל את משתני הסביבה
כי אז הם מתייחסים להמשך.
הפיקוד כאן להגדרת setenv משתנה.
זה איך אתה מגדיר את זה. זה 3 אלמנטים: setenv, משתנה, ערך.
אם אתה פשוט setenv ללא ויכוחים, מה אתה מקבל?
רשימה של כל המשתנים הללו.
שוב, זה רשימה ארוכה נחמדה ובמקרה הזה, כמו באחרים,
המשתנים הללו מוגדרים בעיקר על ידי פעולת ההתחברות שלי על ידי הפגז עצמו
ולא על ידי שום דבר שעשיתי.
יש פקודה אחרת כאן, printenv.
שגם מדפיס את הסביבה.
שים לב דבר אחרון שזה כאן, = עורך vi.
זה אומר שאם אני משתמש במשהו שקורא עורך
ואני לא מציין עורך וזה מאפשר לי בחירה, זה יכול לתת לי את vi.
מה אם אני עושה עורך printenv? זה אומר לי מה זה.
ממש לפני שהיה משתנה, פחות.
אלו הן אפשרויות ברירת המחדל שלך כשאני מפעיל את הפקודה פחות,
אשר מציג קבצים.
אז אם אני עושה את זה, printenv יכול לקחת את הטיעון 1 או 0 ויכוחים,
לא יותר מ 1.
ישנן פקודות אחרות גם, אבל אנחנו לא הולכים להיכנס לכל זה היום.
זוכר שהיו מכפילי עבור משתני המעטפת כמו: שעות,
שירד לאלמנט האחרון של נתיב,
או: r, שירד להארכה.
מי עכשיו חלים על משתני הסביבה מדי. הם לא רגילים אליו.
זה היה אמור להיות שהם לא יכלו להיות שונה. עכשיו הם יכולים להיות.
זה אחד מההתקדמות עם ההתפתחויות של הפגזים לאורך השנים.
שאמרתי שהפגזים כחלק מהסביבות
ומשתני פגז בC-shell הם, עם כמה יוצאים מן הכלל, קבוצות שונות.
אתה יכול להקים משתנה סביבה ומשתנה קליפה עם אותו שם.
הם יהיו משתנים שונים: הם יכולים לקבל ערכים שונים.
שינוי ערכו של אחד לא ישנה את ערכו של האחר.
כל המשתנים הללו מוערכים עם סימן הדולר - $, מה ש$.
אז מה אם יש לך את זה? האם אתה יודע איזה מהם אתה מקבל?
בבדיקות שלי יש לי את משתנה הקליפה,
אבל זה לא מתועד ואתה לא יכול לסמוך על זה.
אז אני שואל אותך, הוא יצירת משתני פגז והסביבה
עם אותם שמות רעיון טוב? מס 'אוקיי.
מה הם חריגים העיקריים אלה שבם משתני הסביבה ופצצות
צמודים זה לזה?
ישנם 4 אלה.
משתנה סביבת TERM מכתב הון,
לשלם לטווח משתנה באותיות קטנות, סוג של הדמיית מסוף.
אני פשוט הולך לעבור על כאן ואני הולך לעשות הד, הפקודה שימושית כאן,
$ לטווח ארוך $. ושם.
xterm הוא סוג מסוף לחלונות המוצגים במערכת X Window.
xterm צבע הוא וריאציה של אותה המאפשרת צבעים שונים.
למה אנחנו מגדירים את אלה? מה זה טוב?
פקודות לארגן מחדש את המסך כמו העורך
לשלוח רצפים מסוימים, הנקראים רצפי בריחה,
למסוף או לחלון כדי לארגן מחדש אותו וכן הלאה.
רצפים אלה הם שונים עבור סוגים שונים של מסופים.
זה אומר לו אילו לשימוש.
לפעמים יש בעיות שם.
ייתכן שתרצה לשנות את זה.
אם דברים לא עובדים, לפעמים סוג החיבור מוגדר לא נכון,
ייתכן שתוכל לתקן את זה על ידי הגדרה מחדש של משתנה הטווח.
במקרים אלה, שינוי משתנה אחד, משתנה הסביבה או משתנה הקליפה,
צריך לשנות את האחר.
אני כבר גיליתי דרך חוויה ששינוי ארוך באותיות גדולות
לא תמיד לשנות את הטווח משתנה פגז באותיות קטנות.
מדובר בבאג.
אני לא יודע אם זה תמיד נכון. רוב הזמן זה לא נכון, אבל זה יכול להיות.
אז אם אתה מבצע שינוי, רק לבדוק את זה.
זה לא לעתים קרובות שאתה צריך לשנות את הערך הזה, אבל פעם בכמה זמן שאתה עושה.
משתמש משתנה סביבה.
שוב, משתנה סביבה באותיות גדולות, לשלם משתנים באותיות קטנות.
זה הוא שם המשתמש שלך.
זה רק בנסיבות חריגות ביותר
שהיית רוצה לשנות את זה.
אם שם המשתמש שלך הוא מישהו אחר, זה יכול לזרוק כל מיני דברים משם.
ספריית בית, ספריית הבית של המשתמש.
שוב, לא היית רוצה לשנות את זה.
שים לב בכל המקרים הללו ואת זה אנחנו עומדים לכסות, משתנים הנתיב,
משתנה סביבה הוא באותיות גדולות ומשתנה הפגז הכבול הוא באותיות קטנות.
אם תשנה אחד, אתה צריך לשנות את זה.
סוג זה של כריכה לא ניתן לקבוע כמו שאתה לא יכול לקשור 2 משתנים,
מלבד אלה 4, ומחייבים במשתנים אלה לא ניתן לבטל,
אתה לא יכול להפריד ביניהם.
אז 4 זוגות של משתנים אלה מאוגדים.
הם תמיד יהיו. אחרים אף אחד לא יהיו.
בנוסף לכך, ניתן יהיה ליצור משתנה עם השמות זהים
מהסוגים הפוכים.
אתה יכול לעשות טווח משתנה פגז באותיות קטנות
או סביבת TERM משתנה באותיות גדולות.
משתנה אלו יהיו בלתי תלויים במשתנים אלה לזווג
והם יהיו תלויים זה בזה.
אני לא יכול לדמיין למה אתה הייתי עושה את זה אלא אם כן אתה רוצה לבלבל אנשים.
זה כאן, משתנה נתיב, זה אחד לא באמת חשוב.
דבר נוסף הוא שלא יכול להיות מקרים
משתנה בעלי שמות מותאמים דומים שאינם קשורים זה לזה.
לא יכול להיות משתנה, SHELL ופגז, באותיות גדולות והקטנות.
בהתבסס על השם הזה, אתה לא יודע אם משתנה שהוא משתנה פגז
או משתנה סביבה, והם אינם מחויבים זה לזה.
אז זה סוג של שמות לזווג אינו מעיד על משתנים מאוגדים.
משתנה הנתיב, שהייתי מראה לפני,
רשימה של נתיבים שבו הקליפה נראית לפקודות.
בואו נגמור לחלון זה כאן ואנחנו נעשה את $ PATH הד, אותיות -
משתנה סביבה - הד נתיב $, אותיות קטנות - לשלם משתנים.
שים לב שהרשימה של ספריות היא זהה. אלה מאוגדים.
שינוי אחד, אתה משנה את זה.
במשתנה סביבת האלמנטים מופרדים על ידי נקודתיים. שים לב ש.
משתני המעטפת מופרדים על ידי רווחים.
משתנה סביבה זה הוא מחרוזת אחת.
משתנה הקליפה הוא מערך.
בורן הפגז לא היה מערכים.
Bash עושה, אבל זה כבר חלק קבוע של הפגז.
זה הוא מחרוזת אחת ולא מערך.
C-shell תמיד היה לי מערכים.
המערכים הם הרבה יותר קל לעבוד איתו.
אתה יכול להתייחס לחלקים ממנו.
נתיב $ אז הד [1] ואני מקבל / usr / bin, הרכיב הראשון.
סימן שוב, זכור דולר מייצג את האלמנט האחרון של רשימת ההיסטוריה.
מה קורה שם? זה ניסה למצוא את סימן דולר כסמל משתנה.
אני לברוח ממנה. אופס. זה לא ייקח גם את זה.
חלק מהדברים האלה לא עובדים כל כך טובים.
אולי אנחנו פשוט נעזוב את זה.
כוכבית מתייחסת לכל העניין, אבל זה מה שאתה מקבל אם אתה לא תציין אלמנט.
דרך נוספת שניתן להשפיע משתני מערך,
מספר האלמנטים שם, 7 אלמנטים.
כאן אנחנו שמים את הסולמית לפני השם המשתנה.
הנה עוד אחד. לשים סימן שאלה שם.
זה הוא ערך לוגי. זה מצביע על כך שמשתנה קיים.
זה בדרך אחרת של עבודה עם משתנים.
זה, דרך אגב, לא חייב להיות משתנה מערך.
זה יכול להיות כל משתנה.
ואם אני עושה, אין משתנה כזה ואני מקבל 0.
עוד דבר קטן שיש על הערכות משתנים.
חזור לזה כאן, אם מסיבה כלשהי אתה רוצה לעבוד עם זה
במקום לעבוד עם המערך, משתנה הקליפה,
יש פקודות שיכולות להפריד בין דברים אלה מבוססים על המעי הגס.
למעשה, אם אתה הולך לעשות את זה במעטפת Bash אולי,
איזה סוג של תסריט, זה יהיה כנראה איך היית עושה את זה.
אבל בC-shell זה הרבה יותר קל להשתמש במערך.
בקליפת בורן, משתנים מוקצים על ידי ביטוי יחיד כמו זה,
כמו הדרך שאתה יכול להקצות משתנה בשפת תכנות,
וכאן חייב להיות ללא רווחים.
זה הכרחי שזה יהיה רק ​​1 מחרוזת.
בפגזים מסוג בורן, כל המשתנים הם משתני פגז.
משתני סביבה הם תת קבוצה של משתני הפגז.
הם נבדלים מהמשתנים שאינם הסביבה על ידי יצוא.
הפקודה כדי לעשות את זה היא יצוא, כמו מדפסת יצוא.
אם היינו מגדיר משתנה כגון,
אם אנחנו רוצים פקודת הדפסה כדי למצוא אותו, זה היה צריך להיות משתנה סביבה,
וככה אנחנו עושים את זה אחד.
כאן יש משהו סוג של מבלבל.
ביטוי זה, יצוא לסביבה, נובע מתפיסת מעטפת זו בורן,
ובכל זאת ביטוי המשמש בתיאורים של C-shell,
שבו אין הפקודה כמו יצוא.
אם אתה פשוט אומר ליצוא על ידי עצמו, אתה מקבל רשימה של יצוא -
אז אם אני פשוט לייצא לכאן, אין דבר כזה.
אוקיי, יש לנו ללכת.
דברים אלה, אגב, גם הגדרתו של הפגז.
אני לא מגדיר את כל אלה בעצמי.
הפגז עושה כל מיני דברים בכוחות עצמו.
זה צריך לעשות דברים באופן אוטומטי.
במעטפת Bash או קורן, אתה יכול להפעיל פקודה כזה,
אשר שניהם ייתנו למשתנה ערך ולייצא אותו בפקודה 1.
בקליפת בורן הם צריכים להיות פקודות נפרדות כמו יצוא.
הנה עוד היבט זה מבלבל.
פקודת הסט בC-shell מגדירה משתנים
ובלי שום טענות אומרת לך מה הם הערכים של המשתנים.
במעטפת Bash, פקודת הסט ללא טיעונים עושה את אותו דבר,
אבל עם טיעונים שהיא עושה משהו שונה לגמרי.
אז אלו הם הטיעונים השונים כאן.
חלקם של אלה משתני סביבה, חלקם משתני פגז.
כולם משתנים פגז באמת. חלק מאלה הם משתני סביבה.
פקודת הסט עם טיעונים יכול לשמש להפעלה
על הפרמטרים positional לתסריט,
שהיא דרך של מקבל את כולם בבת אחת.
אנחנו לא יכולים באמת להיכנס לזה היום.
זה גם יכול לשמש כדי לשנות את מעטפת התנהגות.
במיוחד בBash ישנם משתנה שיקבעו כיצד הפגז מתנהג.
ואז גם רק בפקודה זו אחת שאתה יכול לראות, בפקודה זו.
הוכן לדפוס ואחריו משתנה וסוגים משתנים משמש בפגזים קורן וש.
זה לא חובה אבל זה יכול לשמש כדי להגביל את הערכים של משתנים,
מה שיכול להיות שימושי כדי למנוע טעויות, וזה די נפוץ.
אז רק אני מציין כי במקרה שאתה רואה אותו במקום.
הפקודה שבו.
זכור שציינתי קודם לכן שבו הפקודה בC-shell,
שיכול להגיד לך את מיקומו של נתיב הפקודה.
הנה החלפת פיקוד.
אתה צריך למצוא במקלדת איפשהו דמות שנראית כך.
המיקום במקלדת הולך להשתנות.
אנחנו כבר נקראו backquote זה. זה בערך בגודל של הצעת מחיר.
זה הולך משמאל למעלה לימין למטה.
כאן במקלדת-Mac שלי זה בפינה השמאלית העליונה.
דמות שיכולה לשמש לביצוע הפקודה בתוך הפקודה.
אם יש לך ביטוי בתוך backquotes,
הביטוי שהוא פקודה, זה לרוץ.
הפלט של הפקודה ש
לאחר מכן החליף את כל ביטוי backquote
בתוך הפקודה כבר שאז רצה עם פלט ש
כחלק מהמחרוזת שלה טיעונים וכן הלאה.
הנה פקודה שמשתמשת בזה.
בואו להפגין את הפעולה כאן.
בואו נלך לכאן, להוציא את backquotes.
הבקרה מקבל אותי לתחילת השורה עם תחביר עריכת Emacs.
עד כה הנתיבים הוא מה שעושה בו,
אבל כשאני עושה את זה ככה, אז זה מתחבר ברשימה זו של נתיבים
במקומו של ביטוי זה כל backquote וריצות ls-l עליהם.
סוג של נוח, הא?
אז זה דבר אחד מסודר. ככה backquotes לעבוד.
עכשיו בואו נרד עוד קצת.
אלה הם כינויים. אני דווקא להשתמש אלה.
אני אנסה להיכנס לזה עם פעולת עריכה 1.
אוקיי.
עכשיו בואו לראות איך הגדרות אלה יצאו.
כינוי LWH אומר לי איך זה מוגדר.
שים לב שזה רק זה, אבל הציטוטים החיצוניים כבר המריאו
וסימן הקריאה היא המריאה.
! *, רשימה של כל הטיעונים שלמות.
בהגדרת כינויו יחול חזרה למקום שאשתמש בזה.
bash ksh LWH. אוקיי.
ראה איך זה עובד? זה חוסך לי קצת הקלדה.
בואו נלך עד קצת רק כדי להזכיר משהו אחר כאן.
שים לב כאן פגזים שונים אלה. הייתי צריך להזכיר את זה קודם.
יש csh 2 לכאן וכך גם / bin / tcsh.
אנחנו יכולים לקבוע באמצעים אחרים כי אלה הם למעשה אותו הקובץ.
זכור שאמרתי אם תקליד sh אתה מקבל bash.
סוג זה ואתה מקבל את זה.
אבל אלה אינם צמודים. אלה שיש לי בודדים אלה לשם.
וזה לא סוג של קובץ שאפשר לקרוא לעוד אחד.
אז אלה הם קבצים נפרדים; אלה C-shell הם אותו הקובץ.
חזור לכאן, השני כאן, כינוי זה,
שים לב שהרצת הפקודה, בקובץ זה.
הכינוי שפועל כך. קובץ אומר לך את הסוג של קובץ.
bash ksh אז fwh. אוקיי.
זה הפלט של פקודת הקובץ.
אני לא יודע אם אתה יודע מה זה אומר כאן,
בינארי האוניברסלי מאך-O עם 2 ארכיטקטורות.
ישנם 2 סוגי מעבד אפשריים ב-Mac,
וכמה תוכניות נכתבו כדי להיות מסוגל לרוץ עם שניהם,
ואת פקודת הקובץ יכולה לקבוע את זה, אז זה מה שזה אומר.
שני הקבצים האלה נכתבו ככה.
אז אנו רואים כיצד הכינוי עובד, אנו רואים כיצד backquote עובד,
אנו רואים כיצד ls הקובץ עצמו או קובץ עובד.
זה לא יכול לעבוד. נסה "איפה איפה" ו "LWH בה". אוקיי, בואו ננסה את זה.
שבו שבו.
שבו הוא פגז מובנה.
זכור קודם לכן הראינו כי בש לא היה שם.
אם תקליד בו במעטפת Bash, אתה מקבל הודעת שגיאה.
זה פשוט חלק מהקליפה במקום להיות פיקוד נפרד.
מה קורה אם אני LWH סוג מחפש שם? לראות מה קורה שם.
רן שבו שבו, קיבל פלט זה, ולאחר מכן ניסה לדרוס ls
כליטר על איפה הוא פגז מובנה.
שבו הוא שם, אבל האחרים לא קיימים.
אף אחד מאלה קיימים, למעשה.
אז זה לא תמיד עובד, וזה גם ממחיש עד כמה דברים
לא עושה בדיוק מה שאתה עלול לחשוב.
בואו נרד עוד קצת כאן.
זה כאן הוא בש. זו גם החלפת פיקוד כמו backquote.
אבל שלא כמו backquote, היא משתמשת בסגנון משתנה זה.
ישנם מספר של ביטויים המתחילים בסימן דולר,
ובעוד אלה הם לא משתנים, הם לווה את השימוש בסימן הדולר
כדי לציין ביטוי מסוג כלשהו.
שיכול להיות מוקף בסוגריים או בסוגריים או בסוגריים כפולים,
שבה יש מטרה שונה.
סוגריים יחיד כאן הם שחילוף הפקודה בדיוק כמו backquotes.
בסוגריים כפולים הוא למעשה חשבון מבצע.
יש תחביר אחר, פעולות אחרות.
תחביר Backquote זמין בש.
עם זאת, אחד זה עדיף. זה הרבה יותר קל לקרוא והיא מאפשרת קינון.
יכול להיות לך בתוך $ (הפקודה) פקודה אחרת,
משהו כמו -
אני מקבל רשימה שם.
זה יעבוד אם יש לי backquote גם.
מה אם אני רוצה לעשות משהו כמו -
אתה כנראה לא ממש להשתמש בפקודה זו,
אבל החלפת פיקוד הפנימית הזה מהדהדת את השמות של כל הקבצים המתחילים ב,
אז זה אחד פועל ls-l על קבצים אלה,
ואז זה רק אחד מהדהד את הפלט.
אתה כנראה לא הייתי עושה את זה, אתה רק תעשה הד או ls,
אבל זה מדגים כיצד הקינון של פקודות עובד.
אז פשוט תכונה נוספת כאן.
הזכרתי את זה קודם לכן, כי כאשר יש לך בו בC-shell,
הקלד עבודות בפגזי בורן מהסוג לאיתור פקודות.
פקודות מובנים, בדיוק מה שאמרתי שם.
פקודות הן חלק מהמעטפת, כמו איפה.
כאשר הפגז מבצע פקודה כמו ls, היא מאתרת אותו דרך הנתיב,
מוצא אותו בכמה ספרייה במקום כלשהו,
קורא שלזיכרון, יוצר מעטפת חדשה,
קורא ls הפקודה או מה שבתוך המעטפת
שבו משתני הסביבה כבר נמצאים,
ואז זה מעביר את ביצוע לזה.
Built-in פקודה, הקוד לפקודה שהוא בתוך הקליפה,
כך הפגז רק מתחיל ביצוע חלק מהקוד משלה.
שבו היא פקודה כזו. זה למעשה מקבל יותר מהר.
זה לא חייב לקרוא משהו בזיכרון, זה כבר בזיכרון.
פקודות מובנים תמיד עדיפות על פני פקודות עם אותו שם.
פקודות שנמצאות בספריות בנתיב עשויות לקבל את אותו שם,
פקודות בספריות שונות, קבצים בספריות שונות.
אחד שמתרחש מוקדם יותר בדרך היא זו שתקבל.
אם יש פקודה מובנית, אתה תמיד מקבל את זה.
אין דרך לתת לו קדימות נמוכות יותר מאשר הפקודה בנתיב.
אם אתה רוצה לקבל את זה בפקודת הנתיב, אתה יכול להקליד את שם הנתיב המלא.
אם היו פקודה שבו בדרך לאנשהו,
אתה יכול להקליד / bin / שבו והיית מקבל את זה.
אם אתה לא רוצה להקליד את כל הנתיב, אתה יכול להגדיר את כינוי.
למעשה, אם אתה נתת את הכינוי בשם זהה לפקודה המובנה, שזה יעבוד
כי הגדרת הכינוי מוערכת
לפני הפגז קובע שזה הפקודה מובנה שאמורה להיות מוצא להורג.
ואז זה נהיה קצת יותר מסובך עם כמה פקודות כאן.
המקרה של חלק מהפקודות הם מובנים בפקודות ובדרך בפועל.
אחד מהם הוא הד, הפקודה הייתי רק לפני זמן קצר בדוגמאות אלה.
אקו הוא פקודה בנתיב ואת זה בכל פגז.
הם לא בהכרח כל מתנהגים באופן זהה.
זה היה במקור הפקודה רק בנתיב.
הוא נבנה בשנת לפגזים מאוחר יותר.
מאחר שקיימות אפשרויות שתלויות בסביבה
ואת אפשרויות שורת הפקודה, פקודות מובנים
נכתבו כדי לפעול בדיוק כמו הפקודה שהייתה בדרך,
זה לא סביר שהם היו נכתבים שדרך
אם הפקודה לא נכתבה כבר על הנתיב.
לכן יש לזה תופעות לוואי. ההיסטוריה שלה יש השפעות כאן.
ישנן אפשרויות שם.
יש גם אפשרות שהוגדרה על ידי משתנה בtcsh נקרא echo_style.
זה אחד מהמשתנים אלה שיכולים לשנות את האופן שבו מהדהד יצירות.
ישנם מקרים אחרים שבו אתה יכול להקצות משתנה
שמשנה את הדרך שהמבצע המעטפת, כולל הפקודה מובנה, עובד.
זה לא משפיע על שום דבר אחר
מכיוון שאין לי פקודות אחרות גישה למשתני המעטפת,
רק משתני הסביבה.
אבל פעולות פגז יכולות לקרוא את משתני הפגז.
זה לא יעבוד עבור csh. זה רק tcsh. זה אחד מהשיפורים.
יש ניתוח רצפים כאשר הוא מעריך metacharacters,
כאשר הוא מעריך את המשתנים, כינויים, אזכור ההיסטוריה.
יש רצף מסוים לדברים האלה.
אם הוא עושה את הדברים ברצף מסוים
ומקבל משהו שהוא ביטוי לסוג
שכבר העריך, זה לא להעריך את זה שוב.
אם הוא מקבל את זה, ואז זה יהיה פשוט לעבור על התווים.
אז אם הערכה של כמה ביטויים כמו החלפת פיקוד
או משתנה או מה שמעורר ביטוי
שבו היית רוצה להיות מוערך,
זה יעבוד רק אם הערכה המתרחשת מאוחר יותר ברצף.
אני מקווה שאני להיות ברור שיש.
כי רצף ניתוח, ניתוח בC-shell,
זה לא אותו הדבר לפקודות מובנים כפי שהוא עבור מים שאינם מובנים בפקודות.
אני לא בטוח לגבי Bash שם.
לדוגמא, אם משתנה פגז מיוצר התייחסות היסטוריה,
זה כנראה לא הייתי הולך אחורה בהיסטוריה.
זה יהיה לקבל את סימן הקריאה פשוט.
למעשה, אנחנו יכולים רק לנסות את זה עכשיו.
להגדיר = ונצטרך לשים את זה שם.
אה, רגע. סליחה. עשיתי את זה בש. אני רוצה לעשות את זה כאן.
ראה, כך שזה לא להעריך כי התייחסות ההיסטוריה
כי זה כבר היה מעבר לנקודה של הערכת ביטויי ההיסטוריה
כאשר הוא בדק את משתנה.
אז זה אפקט 1 של ניתוח.
ושוב, פקודות מובנים לא נעשית באותה הדרך.
בסדר. בואו נלך לצד אחד כאן.
זה נועד להיות קו 1, אבל זה מה שהופך אותו קל יותר לקריאה.
מה זה עושה?
אולי אתה זוכר שאנחנו יכולים להעריך את הכוכביות כתווים כלליים קובץ,
ויש בתווים כלליים קובץ אחרים כמו סימן השאלה וביטויי סוגר.
סוג זה של הערכה נקרא globbing.
להגדיר noglob בתחילת פקודה זו אומר לא עושה את זה.
noglob unset אומר לחזור לעשות את זה.
הערה גוש סט שלא לקבל אותו האפקט.
בשפה המדוברת, היה נראה גוש להגדיר או noglob unset להיות שווה ערך,
אבל הנה זה לא. זה noglob unset.
עכשיו tset. tset עמד לסט מסוף.
זה לא רגיל כי לעתים קרובות עכשיו, אבל לפני שמערכות חלונאית הפכו זמינות
והיה לך מסוף יחיד, ייתכן שתצטרך לקבוע את הסוג.
ואם משהו היה מגיע על Ethernet או מהרשת,
אולי אתה רוצה לומר שזה VT100.
VT100 הוא סוג של סטנדרט בעסק המסוף. זה בא ממסוף דצמבר.
אם אתה פשוט עושה את החיוג - לב לזה? זה חוזר דרכים, הא?
אז אם אנחנו פשוט tset כאן,
אם אני פשוט עושה את tset, זה מאפס את המסוף שלי, אבל אתה לא רואה שום דבר.
זה לא באמת משנה כלום.
-S
אוקיי.
TERM setenv xterm צבעים.
אנחנו כבר יודעים כי לטווח הוקם בדרך זו, כך שלא השתנה.
זו הדרך שהיינו רוצה לעשות את זה.
אבל שם לב שהפקודה, tset-s, פלט רק זה פקודות אלה. זה לא להפעיל אותם.
זה לא להפעיל פקודות אלה, היא פלט אותם.
אז זה נועד כדי לייצר פקודות שלאחר מכן ניתן יהיה להפעיל.
אתה זוכר את הפקודה בקובץ שאני רק הראיתי לך ש בו.
אז בואו לעשות את זה.
ש מדכא כמה פלט, אבל זה לא משנה כאן, כפי שאתה יכול לראות.
אני רק עושה את זה כדי להראות לך שזה לא משנה.
זה בתחביר backquote.
הערה backquote כאן, backquote כאן.
אני משמיט את הדברים האלה כאן.
אלו הם מקרים של אומר לו מה לעשות
במקרה של סוגים מסוימים של מסופים -
Ethernet, רשת, חיוג, מה יש לך.
זה לא משנה כאן, כי אנחנו לא ממש עושים את כל הדברים האלה.
אני רק ממחיש את הפקודה.
אם אני עושה את זה עם backquote, מה אני הולך לקבל?
גם להבחין כאן כי זה כלל את noglob הסט וnoglob המוגדר,
אז אלה הם עכשיו מיותרים בהגדרה.
זה לא תמיד היה נכון, אבל עכשיו הם נכללו בפקודה זו.
אבל בואו נראה מה קורה אם אני עושה את זה
וללכת לתחילת השורה בבקרה ואני עושה את זה.
אוקיי, נקבע: פקודה לא נמצא. זה קצת מוזר, לא?
סט הוא הפקודה ידועה. זה חלק מהקליפה.
להגדיר: הפקודה לא נמצאה? מדוע זה כך?
הממ. ובכן, בואו נחשוב על זה.
זה פועל שחילוף פקודת backquote,
וזה מתרחש בחלק מסוים של הרצף של ניתוח את הפקודה.
סט הוא הפקודה מובנה.
כך שעד שהיא עושה את זה החלפת פיקוד,
זה כבר הגיע מעבר לנקודה של זיהוי פקודות מובנים.
אז זה מתייחס להגדיר כאילו היה פקודה בנתיב.
למותר לציין, זה לא מוצא את זה ואתה מקבל הודעת שגיאה.
כן. יש דוגמא של רצף ניתוח.
ומה אנחנו עושים בקשר לזה?
שים לב פקודה מאוד מעניינת כאן, eval.
אני תוהה מה שעושה.
אם אתה מסתכל על המדריך - ובוא פשוט לעשות את זה
כדי להראות עד כמה מבלבל מדריכים אלה הם -
tcsh אדם, הוראות מבולבלות, למצוא כאן דברים היא לא קל.
כאן אנו eval ARG ללכת,, אז אנחנו יכולים להיות 1 או יותר טיעונים
ויש רשימה של דברים שיש.
מתייחס לטענות כתשומות לקליפה
ומבצע את הפקודות וכתוצאה מכך בהקשר של הפגז הנוכחי.
זה משמש בדרך כלל כדי לבצע פקודות שנוצרו כתוצאה מהפקודה
או החלפה משתנה בגלל ניתוח מתרחש לפני ההחלפות הללו.
טוב מאוד.
וכאן הם אפילו מתייחסים לפקודת tset לשימוש מדגם
כמו זו שאני רק הראיתי לך.
עכשיו אני צריך לקבל את החלון אחורי למקום שימושי.
בואו נגמור פה ואנחנו תראו הערכה המשמשת ממש לפני זה.
אז בואו נראה מה קורה אם אנחנו שמים - כאן אנחנו הולכים עם החיצים לפקודה כי
ובקרה להתחלה, הערכה.
אוקיי, אז זה עובד.
כאשר אתה עושה הערכה, זה לוקח מה שבא אחריו והופך אותו לפקודה.
זה מאפשר לך בעצם לנתח את זה פעמיים.
הסעיף כאן פועל בפקודה זו בתוך backquotes,
מקבל את הפלט.
הפלט אמור להיות מנוהל כפקודות אלה כאן כמו אלה
בשלב זה אחד וזה אחד.
אז פקודות אלה נמצאים כעת כאן ברצף הזה,
אך אלה מובנים בפקודות והוא לא יכול לקבל אותם מייד.
אז אנחנו הולכים לeval, eval מרים את זה, מתחיל את כל העניין מחדש, וזה עובד.
דוגמא שניהם backquoting, הערכה, ניתוח, השלכות של ניתוח,
ופקודה שהוא כנראה שימוש מעט מאוד כדי לך בימינו.
אוקיי. בסדר, umask.
בואו נסתכל על פקודה זו כאן, umask 022. אני תוהה מה שעושה.
בואו פשוט להקליד umask עם שום דבר אחרי זה. 22. אוקיי.
022 ולעשות את זה שוב.
כפי שאתם יכולים לנחש, umask ללא טיעונים אומר לך את המסכה הנוכחית;
umask עם טיעונים הופך אותו לזה, אבל זה היה אחד כבר היה לי.
מה 022 אומר?
אלה נמצאים כאן הגנות לקובץ.
הם קובעים למי מותר לקרוא או לכתוב או להפעיל את הקובץ.
הגנות נקראות גם הרשאות.
R מייצג קריאה, w לכתיבה,
וx, שהוא אינו נוכח שם, עומד לביצוע.
ישנן 3 קטגוריות שם.
3 האלמנטים האחרונים הם בקטגוריה של משתמשים. אלה יחולו עליי, המשתמש.
אלה 3 כאן חלים על הקבוצה.
הקובץ שייך לקבוצה 1, משתמש יכול להשתייך לכמה קבוצות,
אבל אם המשתמש נמצא בקבוצה שאליה קובץ זה שייך,
אז הגנות אלה תחולנה עליו אם הוא לא למשתמש.
ואת זה הוא כולם.
קטגוריות אלו הן סותרות.
הגנות המשתמשים חלות עליו,
הגנות הקבוצה חלות על חברי הקבוצה אחרים מאשר למשתמש,
וההגנות האחרות חלות רק על אנשים אחרים מאשר המשתמש וחברי הקבוצה.
אם יש r או aw או x, זה אומר שהגנה היא מובן מאליו.
אם יש מקף, זה אומר שזה לא.
למעשה יש דברים אחרים שניתן לשים בפה מלבד אלה,
שאני לא אכנס עכשיו.
Umask מגדיר ברירת מחדל עבור קבצים שאתה יוצר.
וכמו מסכה, בעצם זה אומר ביטים שאינך מוגדר.
כיצד זה הפך לביטים?
אם אתה חושב על כל אחד מאלה, כמו מספר אוקטלי,
זה קצת 1s, זה 2s, זה 4s.
אז 0 עד 7
יתאר מה שילוב של r של, W של, וx של יש לך עבור אלה 3
ולאחר מכן מספר דומה לאלה ולאחר מכן לאלה.
אז 022 אומר 0 לאחרים, 2 לקבוצה, 2 עבור המשתמש.
אבל זו מסכה. המסכה היא מה שאין לך.
אני מצטער. אני רק נתתי לך דברים שלא בסדר הנכון.
זה 3 הראשונים. 3 אלו הם המשתמש, 3 אלה הם הקבוצה, 3 אלה הם אחרים.
סליחה שנתתי לך את אלה שלא בסדר הנכונים.
0, שהוא ראשון מאלה, אינם מציגים את הערך,
אבל אם מספר הוא לא שם, זה 0.
זה אומר שכל 3 מהם יהיו מותר.
שים לב שבפרט זה אחד x אינו מותר.
הסיבה לכך היא שהמעטפת היא מסוגלת לקבוע
אם קובץ צריך להיות מוצא להורג או לא.
מכיוון שאין זה קובץ הפעלה, הוא לא הגדיר את x.
2 פירושו שיכתוב רשות, הקטגוריה השנייה כאן,
אחד באמצע, הוא הכחיש.
אז שוב, אלה הם הדברים שהוא נדחה.
ובכן, x מותר אבל זה לא לכאן כי זה לא הפעלה
ובאופן דומה לאחרים.
אז זה umask משותף.
עוד אחד נפוץ הוא 700 - לתת לעצמך כל דבר ואף אחד אחר שום דבר.
ויש אפשרויות אחרות.
אני אחזור לזה. שימוש בהיסטוריה אני יכול לחפש אחורה בשביל זה, LWH לשם.
אוקיי. אז הנה, אלה הם הפגזים.
Bash, הבעלים שהוא חשבון מערכת, יכול לעשות הכל.
קבוצה וכל אחד אחר יכולים לעשות לקרוא או לבצע אך לא לכתוב.
אחד זה אפילו לא לאפשר לבעל לכתוב לה.
אם הבעלים רצו לכתוב לה, על חשבון המערכת,
הוא יצטרך לשנות את ההגנה ראשונה.
אבל שוב, umask קובע את ברירת המחדל על ידי מיסוך את זה,
על ידי המציין את הביטים שלא להיות מוגדר.
זה בדרך כלל באחד מקבצי האתחול שלך, שהיא. Cshrc לC-shell
או. הפרופיל עבור פגזי בורן מהסוג.
זה יכול להיות במקום אחר גם אם יש קבצי אתחול אחרים במערכת.
בכל מקרה, זה umask.
יש סוג של משהו מוזר כאן,
וזה, מדוע יש פקודה אחת לכך?
אם הייתי כותב את זה, הייתי עושה את זה משתנה, umask = ערך כלשהו.
מדוע יש כל פקודה רק למטרה זו?
הסיבה לכך היא זה פשוט חוזר למקורות של יוניקס.
יוניקס היה רק ​​חלק פרויקט תכנות במעבדות בל בתחילת 1970s.
אנשים פשוט הגיעו יחד לתכנית.
הם אף פעם לא התכוונו שזה יהפוך למערכת הפעלה ברחבי העולם.
אנשים שונים כתבו חלקים שונים בלי לחשוב הרבה מאוד
של איך שהם הולכים להיות בשימוש - ולא מרפרף.
והוא הגיע יחד כמו זה, וזה עדיין ככה במובנים מסוימים.
אז המשקף את ההיסטוריה, ויש עדיין חוסר העקביות האלה ואלמנטים מוזרים שלו.
אוקיי. הבא כאן.
כפי שכתבתי קודם, ה-C-הפגז הוא לא ממש בשימוש מאוד לתכנות,
למרות שזה יכול להיות.
הוא מריץ לאט יותר, שוב trade-off בין שימוש האינטראקטיבי,
שבו יש עיבוד יותר מעורב מאשר מהירות,
אשר יכול לעשות ללא העיבוד.
תכונות נוספות נוספו לפגז בורן ידי קורן ובורן, שוב פגזים
לא נראה לי להאט אותם, ואני לא יודע למה זה.
זה יכול להיות רק בתכנות טוב יותר, אבל לא בעמדה יודעת שאני.
להאיץ כאן הוא בעצם לא כזה ביג דיל, למרות שהוא הזכיר.
הסיבה לכך היא שתסריטי פגז ממש מקבלים די מהר.
אם יש הרבה פקודות כמו בתכנית calculational,
אתה כנראה לא עושה את זה בתסריט פגז.
הפעילות שם הן די פשוטה וברורות.
אלה שאני כבר חוויתי את זה הם איטיים מדי
כרוך בבקשות חוזרות ונשנות של פקודות איטיות.
קודם לכן ציינתי עורך הזרם sed. פקודה זו היא איטית.
אם לבצע פעמים רבות SED, תקבל תסריט איטי, אבל זה לא הפגז זה איטי.
מפעיל אותו במעטפת בורן לא יהיה הרבה יותר מהר מאשר מפעיל אותו בתיקיית C-הפגז,
למרות שיש אולי כמה יתרונות שם.
יכולות תכנות נוספות, ומצד שני,
סיבות משמעותיות למה שהיית משתמשים בפגזים מסוג בורן.
יש C-shell תכונות מוזרה זה -
העובדה שאתה לא יודע אם משתנה הוא משתנה פגז או משתנים סביבה.
זה יכול להיות מאוד מבלבל.
זה לא כל כך קל לכתוב
רק על סמך הניסיון של תכנות בשפות אחרות שלך.
אני חושב שאתה יכול למצוא את הפגזים בורן מהסוג עקביים יותר עם החוויה שלך.
תסריטים מסוימים, אם כי, יכולים להיות אלפי קווי אורך.
אלה שראיתי משמשים לתיקון מערכות הפעלה.
מי יכול לבצע לאט מאוד, אבל אתה לא רצת אותם לעתים קרובות מאוד.
זה רק כאשר אתה עושה תיקון,
וזה רק מנהל המערכת שעושה את הדברים האלה,
כך שזה לא ממש ממש בעיה.
אלה הם מאות תורים ארוכים למעשה לבצע די מהר.
להזכיר את זה כאן, מה הם השיפורים האלה?
אני כבר הזכרתי כמה מהם - מערכים, חישובים,
$ (ביטוי) לחישובים במעטפת Bash,
סוג האחר של החלפת פיקוד.
ישנם סוגים שונים של פקודות בדיקות שונות
שבו אתה יכול לעשות מבחנים מותנים בקיומו של קובץ או דברים אחרים.
האחרון כאן, בפקודה זו כאן.
מה זה עושה, ולמה שמישהו ישתמש בו?
variablename printenv.
אנחנו יודעים מה printenv עושה. הוא אומר לנו את הערך של משתנה.
וvariablename printenv לא יגיד לנו מאוד בגלל שאין משתנה כאמור.
בלנק.
אבל בואו אתן לו משהו משמעותי.
זה לא שם. אוקיי. אני מניח שמעולם לא הגדרתי את זה.
בואו פשוט לבדוק את הסביבה שלי.
זוהי פקודה אחרת שבו אתה יכול לבדוק את הסביבה שלך.
אין עורך ישן וטוב, אחד שראינו קודם.
מה זה עושה?
כאן יש לנו ביטוי backquote.
זכור זו היא ה-C-הפגז.
אז עורך printenv ייתן לנו ערך של עורך. זה ששי.
ואז זה יהיה להגדיר את הערך שלמשתנה, פקודת הסט.
אז עכשיו אם אני עושה $ הד, אני מקבל vi.
זה לא נראה שימושי מאוד.
עם זאת, דווקא יש לו מטרה.
מכיוון שאנו לא יודעים אם משתנים הוא משתנה פגז או משתנים סביבה
באמצעות תחביר הערכת סימן דולר, אנו יכולים להשתמש printenv
כדי לוודא שזה משתנה סביבה.
אז אם היה עורך משתנה קליפה, זה לא הייתי מקבל את זה.
זה עובד רק עם משתנה הסביבה.
אם לא היו משתנה פגז ואני רוצה את הערך שלו,
הייתי צריך למצוא דרך אחרת כדי לעשות את זה.
דרך אחת לעשות זאת תהיה על ידי ביצוע סט וצנרת.
זהו אחד metacharacters, תווים מיוחדים.
זה שולח את הפלט של סט למשהו אחר.
בואו נראה מה אנחנו יכולים למצוא שם.
שום דבר. אוקיי. בואו רק לראות מה יש שם כולם יחד.
זה היה echo_style, אחד שהזכרתי קודם. אוקיי, בואו נעשה את זה.
זכור שציינתי קודם, echo_style
קובע את האופן שבו פקודת ההד תפעל.
bsd מייצג הפצת ברקלי רגילה.
זה יוניקס ברקלי מן 1970s.
זאת אחת הדרכים שההד יכול לרוץ.
הגדרת echo_style לערך שבTC-הפגז תגרום הד להתנהג ככה.
אז להגדיר עושה את זה, אבל להגדיר רק מקבל משתני פגז.
זה לא היה מוצא את העורך, שאינו משתנים פגז.
שום דבר.
אז זו דרך אחת להבחין בהם.
אבל העובדה שיש לך לעבור כמה הפקודה מוזרה כזה
להבחין בין משתני פגז או משתני סביבה
מציג את הסוג של הטבע מעשי של ה-C-shell למטרות מסוימות.
ועכשיו, אחרון ואולי לפחות, זה את הדפים.
אלה של מי שאתה ודאי יודע, האדם הוא קצר פקודה לידנית.
דפי האדם לפגזים הם קשים לקריאה. הם ארוכים מאוד.
הם מאורגנים באופן שעשוי להקשות כדי למצוא את מה שאתה מחפש.
אז אם אתה מחפש משהו עם מטרה,
אתם אולי לא יודעים אם המטרה שאינה משתנה פגז או משהו אחר,
לכן ייתכן שלא יודע איפה לחפש אותו.
אתה יכול להסתכל למחרוזות שונות, אבל בחוטים לעתים קרובות חוזרים על עצמם.
אז זה בדרך כלל קשה לקריאה.
אנחנו רק הסתכלנו בדף איש TC-הפגז קצת לפני כדי למצוא את פקודת eval.
יש דברים שהולכים מהר יותר.
גישה אחת היא לחפש את מחרוזת.
אתה יכול להשתמש באיתורית.
יש זימונית הלוכסן לחפש פקודה או מחרוזת בתוך מבצע הביפר.
גבר כברירת מחדל ישתמש איתורית, או להיות פחות או יותר.
אני לא יודע אם אתה מכיר אותם, אבל אלה יכולים להראות קבצי טיפי טיפין.
אני כבר משתמש פחות להציג קבצים אלה בפרט שיש לנו כאן.
אתה יכול לחפש בפנים.
אתה יכול לנסות להשתמש במחרוזות חיפוש שונות.
גם דפי אדם במערכות הפעלה שונות לא יכולים להיות אותו הדבר.
הם יכולים להיות דפים נפרדים לcsh וtcsh.
הם לא על מק, אבל הם יכולים להיות אם אלה הם פקודות נפרדות.
אם sh לא ממש קורא בש, שם כנראה יהיה דף אדם נפרד.
יש כמה מערכות דפי אדם נפרדים רק לפקודות המוכללות ב-C-shell.
לפעמים, אם אתה רוצה לקרוא תיאור של הפקודה מובנה
זה גם בדרך, כמו הד, אתה צריך לקרוא את עמוד האדם על הפקודה שעל הד
כדי לקבוע עד כמה זה יעבוד כפקודה מובנה
גם אם אתה לא קורא את הפקודה המובנה.
זה חסרון של מערכת ההפעלה באופן כללי, לא רק לפגזים,
אם כי עבור הפגזים בפרט דפי האדם הם די ארוכים,
בין השאר משום שהם הוסיפו תכונות שימושיות להם, אשר עשוי להיות חיובי.
אוקיי. האם יש שאלות? כל נושאים שאתה רוצה להעלות?
שום דבר רלוונטי לכאן?
ובכן, זה היה מאוד נחמד לדבר עם כולכם.
אני מקווה שיש לך משהו מהסמינר
שיהיה שימושי עבורך בעשייה שלך בעתיד.
[CS50.TV]