Download presentation
Presentation is loading. Please wait.
1
תרגול 6 תוכניות שרות סטנדרטיות ב -UNIX C-Shell לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il נערך והורחב ע''י ודים אייזנברג
2
תוכניות שרות סטנדרטיות ב - UNIX Unix תוכניות שרות (utilities) סטנדרטיותבכל מחשב בו מותקנת מערכת הפעלה מסוג Unix מותקנות בנוסף מספר תוכניות שרות (utilities) סטנדרטיות פקודות (commands) –בפשטות נקראות גם פקודות (commands) סטנדרטיות כל משתמש Unix יכול להריץ תוכניות אלה לצרך ביצוע משימות שלו לשלב בין תוכניות בשורת הפקודהב -Unix ניתן לשלב בין תוכניות ( שרות ורגילות ) בשורת הפקודה בצורה נוחה משימות מורכבות בשורת פקודה אחת –לבצע משימות מורכבות יחסית בשורת פקודה אחת התוכניות הסטנדרטיות ההרכבה כוח רב למשתמשמספר גדול של התוכניות הסטנדרטיות וצורה נוחה של ההרכבה ביניהן מקנים כוח רב למשתמש 2
3
הפקודה echo echo echo מדפיסה את הפרמטרים שלה 3 >echo Hello world ! Hello world !
4
פקודות לעיבוד קבצים נלמד מספר פקודות לעיבוד קבצים ב -Unix עיבוד קבצים : תוכן – הדפסת תוכן קבצים שורות מסוימות –הדפסת שורות מסוימות מקבצים בצורה ממוינת –הדפסת קבצים בצורה ממוינת חלקי שורות –הדפסת חלקי שורות מקבצים –ספירת שורות –ספירת שורות, מילים ותווים בקבצים 4
5
פורמט של רוב הפקודות לעיבוד קבצים command [options] [input files] אופציותהפקודה מקבלת אופציות ( דגלים ), בד '' כ כלל תו "-" ואות אחת קובצי קלטהפקודה מקבלת אחד או כמה קובצי קלט הקלט הסטנדרטיאם לא ניתן אף קובץ קלט הפקודה מצפה לקלט מהקלט הסטנדרטי פלט הסטנדרטיהפקודה מוציאה את הפלט שלה לפלט הסטנדרטי 5
6
הפקודה head head [-N] [input files] מדפיסה N השורות הראשונות מתוך הקלט –ברירת מחדל היא 10 –בהינתן הקבצים a_file b_file 6 a line 1 a line 2 a line 3 a line 4 a line 5 b line 1 b line 2 b line 3 > head -2 a_file a line 1 a line 2 > head -1 < b_file b line 1 > head -2 a_file b_file ==> a_file <== a line 1 a line 2 ==> b_file <== b line 1 b line 2
7
הפקודה tail tail -N [input files] Nמדפיסה N השורות האחרונות מתוך הקלט –ברירת המחדל היא 10 tail +N [input files] החל מהשורה Nמדפיסה השורות האחרונות מתוך הקלט החל מהשורה N 7 > tail -2 a_file a line 4 a line 5 > tail +2 a_file a line 2 a line 3 a line 4 a line 5
8
משימה פשוטה : להדפיס שורות 2 ו -3 של קובץ איך עושים את זה בעזרת head ו -tail ? > head -3 > first3 > tail -2 first3 a line 2 a line 3 > rm first3 מסורבל 8
9
פתרון פשוט : שילוב בין תוכניות בעזרת pipeline לשלב pipelineב -Unix ניתן לשלב בין תוכניות בעזרת מגנון pipeline: > program1 | program2 | program3 הפלטמחובר לקלט 'I'הפלט הסטנדרטי של command1 מחובר לקלט הסטנדרטי של command2 בעזרת סימן 'I' 9 command1 stdout command2 stdinstdout command3 stdin
10
Pipelining > program1 | program2 | program3 לוקחת כקלט הפלט של קודמתה לבאה אחריהכל תוכנית ב -pipeline לוקחת כקלט את הפלט של קודמתה, מבצעת את המשימה שלה ומעבירה את הפלט שלה לבאה אחריה בשורה. –פתרון של המשימה הקודמת בשורה אחת : > head -3 a_file | tail -2 a line 2 a line 3 10
11
פקודה cat cat file_1 file_2 … file_k אחד אחרי השנימדפיסה את תוכן הקבצים file_1,file_2,…,file_k לפלט הסטנדרטי אחד אחרי השני דוגמא : > cat b_file a_file | head -4 b line 1 b line 2 b line 3 a line 1 11
12
הפקודה less less less עם ההפסקה אחרי כל דףמציגה את הקובץ על המסך עם ההפסקה אחרי כל דף לדפדף קדימה ואחורה –ניתן לדפדף קדימה ואחורה בקובץ המוצג בעזרת מקשי החצים לחפש –ניתן לחפש מחרוזת על ידי הקשת תו / ואחריו המחרוזת לחיפוש –יוצאים מהפקודה על ידי הקשת :q או Ctrl-c q 12
13
התנהגות הפקודה ls הפקודה ls מדפיסה רשימת קבצים הפלט שונה בהתאם ליעדצורת הפלט שונה בהתאם ליעד הפלט למסך בשורות –אם הפלט מיועד למסך ls מדפיסה את קבצים בשורות לקובץ או ל -pipe אחד בשורה –אם הפלט מיועד לקובץ או ל -pipe, ls מדפיסה את הקבצים אחד בשורה > ls aaa ccc eee bbb ddd > ls | cat aaa bbb ccc ddd eee > ls > out > less out aaa bbb ccc ddd eee 13
14
הפקודה tee tee [options][files] משכפלת ושולחת לפלט הסטנדרטי לכל אחד מהקבציםהפקודה משכפלת את כל מה שנכנס לקלט הסטנדרטי שלה ושולחת אותו הן לפלט הסטנדרטי והן לכל אחד מהקבצים ב [files] לדוגמא, אם בנוסף להצגת השורה השנייה והשלישית נרצה לשמור את שלוש השורות הראשונות של הקובץ a_file בשני קבצים שונים, נוכל לבצע : אופציות נוספות : שרשור –האופציה -a מאפשרת שרשור של הפלט לסוף הקבצים [files] במקום מחיקתם. > head –3 a_file | tee file1 file2 | tail –2 14
15
תיאור גרפי של הפעולה של tee 15 From http://commons.wikimedia.org/wiki/File:Tee.svg, Creative Commons License http://commons.wikimedia.org/wiki/File:Tee.svg
16
הפקודה tee tee [options][files] לא בפורמטשימו לב שהפקודה tee היא לא בפורמט הסטנדרטי של פקודות לעיבוד קבצים : רק מהקלט הסטנדרטי –היא מקבלת את הקלט רק מהקלט הסטנדרטי הקבצים לפלט –היא מקבלת רשימת הקבצים לפלט, ולא לקלט 16 From http://commons.wikimedia.org/wiki/File:KF_25_Tee.jpg http://commons.wikimedia.org/wiki/File:KF_25_Tee.jpg Creative Commons License Creative Commons License
17
הפקודה sort sort [options] [files] ממוינתמדפיסה את תוכן הקלט בצורה ממוינת –בררת מחדל : מיון לקסיקוגרפי אופציות : מספרי -n ממיין בסדר מספרי הופך -r הופך את סדר המיון מתייחס החל ממילה num -k num מתייחס לכל שורה החל ממילה num, המילים ממוספרות החל מ -1 uppercase/lowercase -f מתעלם מהבדלי uppercase/lowercase ממזג -m ממזג מספר קבצים שכבר מויינו לקובץ אחד ( יותר יעיל מאשר למיין אותם שוב כקובץ אחד ) רווחים בתחילת השורה -b מתעלם מרווחים בתחילת השורה פיסוק -d מתעלם מסימני פיסוק 17
18
הפקודה sort - דוגמאות > less data World whould for Father > sort data Father World for whould > sort data -f Father for whould World > sort data -r whould for World Father > ls -al total 6 -rw------- 1 romano root 520 Nov 8 23:09 data -rw------- 1 romano 368 43 Nov 8 23:12 ex1 -rw------- 1 romano 368 428 Nov 8 23:22 ex2 -rw------- 1 romano 368 322 Nov 10 13:30 ex3 > ls -al | sort -n -k 5 total 6 -rw------- 1 romano 368 43 Nov 8 23:12 ex1 -rw------- 1 romano 368 322 Nov 10 13:30 ex3 -rw------- 1 romano 368 428 Nov 8 23:22 ex2 -rw------- 1 romano root 520 Nov 8 23:09 data > 18
19
סדר מילוני לעומת מספרי חשוב להבדיל המילוני המספריחשוב להבדיל בין הסדר המילוני ( לקסיקוגרפי ) והסדר המספרי 19 > less numbers 22 111 3 > sort numbers 111 22 3 > sort numbers -n 3 22 111
20
הפקודה grep grep [options] [^]word [files] מדפיסה שורות בהן מופיעה המילה word אופציות : לא מופיעה פעולה הפוכה -v הדפס את השורות, בהן לא מופיעה word ( פעולה הפוכה ) uppercase/lowercase -i התעלם מהבדלי uppercase/lowercase מופיעה בדיוק -w הדפס את כל השורות בהן מופיעה word בדיוק ( לא כתת מחרוזת ) 20
21
הפקודה - grep דוגמאות –בהינתן הקובץ farm1 goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral > grep cow farm1 cow Betsy slim cow Dazy two cows Dartsy & Teo > grep -v cow farm1 goat Upton Fat Cow Burger horse Admiral > grep -i cow farm1 cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo > grep -w cow farm1 cow Betsy slim cow Dazy 21
22
הפקודה - grep נקודות נוספות ביטוי מספר מיליםאם רוצים לחפש שורות בהן מופיע ביטוי המורכב ממספר מילים המופרדות ע " י רווחים, כותבים את הביטוי בין גרשיים : > grep "slim cow" file ^כשסימן ^ מופיע לפני המילה, grep מדפיסה את כל השורות המתחילות במילה הזאת : > grep ^cow file 22
23
הפקודה - grep דוגמאות –בהינתן הקובץ farm1 goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral > grep "slim cow" farm1 slim cow Dazy > grep ^cow farm1 cow Betsy 23
24
הפקודה grep - אופציות נוספות השורות ואת מספרן -n הדפס את השורות ואת מספרן בקבצים שמות הקבצים ללא השורות -l הדפס רק את שמות הקבצים בהם השורות נמצאו ללא הדפסת השורות עצמן מספר השורות ללא השורות -c הדפס רק את מספר השורות שנמצאו בכל קובץ ללא הדפסת השורות עצמן 24
25
הפקודה - grep דוגמאות –בהינתן הקבצים farm1 farm2 goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral sheep Brook cow Leni goat Aster cow Oreo > grep cow farm1 farm2 farm1:cow Betsy farm1:slim cow Dazy farm1:two cows Dartsy & Teo farm2:cow Leni farm2:cow Oreo > grep -n cow farm1 farm2 farm1:2:cow Betsy farm1:3:slim cow Dazy farm1:5:two cows Dartsy & Teo farm2:2:cow Leni farm2:4:cow Oreo > grep -l cow farm1 farm2 farm1 farm2 > grep -c cow farm1 farm2 farm1:3 farm2:2 25
26
הפקודה uniq uniq [options] [input_file [output_file]] הזהות הסמוכותמדפיסה עותק אחד של כל השורות הזהות הסמוכות הפלט הולך לקובץ output_file ( או בהיעדר הקובץ output_file, לערוץ הפלט הסטנדרטי ) לא בפורמטשימו לב שהפקודה uniq היא לא בפורמט הסטנדרטי של פקודות לעיבוד קבצים : רק מקובץ אחד –היא יכולה לקבל את הקלט רק מקובץ אחד –הקובץ השני הפלט –הקובץ השני הוא קובץ הפלט 26
27
הפקודה uniq - אופציות ספור עותקים -c הדפס כל שורה פעם אחת בלבד וספור עותקים של כל שורה. רק יותר מפעם אחת -d הדפס רק שורות המופיעות יותר מפעם אחת רק מפעם אחת בלבד -u הדפס רק שורות המופיעות מפעם אחת בלבד ניתן להשתמש רק באחת מהאופציות -c/-d/-u בו זמנית התעלם המילים הראשונות -N התעלם מ - “N” המילים הראשונות ( לפני קבלת ההחלטה אם שתי שורות זהות ) 27
28
הפקודה uniq - דוגמאות > less file3 one two three one > uniq file3 list > less list one two three one > > less names Uri Dan Uri Elena Alex Ofra Uri Ofra 28 > sort names | uniq -c 1 Alex 1 Dan 1 Elena 2 Ofra 3 Uri > sort names | uniq -d Ofra Uri > sort names | uniq Alex Dan Elena Ofra Uri > sort names | uniq -u Alex Dan Elena
29
הפקודה cut cut options [files] תווים שדות משורותמדפיסה תווים או שדות מכל אחת משורות הקלט אופציות : תווים לפי האינדקסים -c list הוצא קבוצת תווים לפי האינדקסים של התווים בשורה, המופיעים ב -“list” שדות לפי האינדקסים -f list הוצא קבוצת שדות לפי האינדקסים של השדות בשורה, המופיעים ב -“list”. שדות המופרדות ע '' י שדות בשורה - קבוצות תוים המופרדות ע '' י תו מפריד כלשהו. ברירת מחדל ברירת מחדל של התו המפריד היא לקבוע -d”c” משמשת בנוסף לאופציה -f ומאפשרת לקבוע את “c” כהתו המפריד 29
30
הפקודה cut - דוגמאות > less file1 a11 a12 a13 a14 a15 b21 b22 b23 b24 b25 c31 c32 c33 c34 c35 > cut -c1-3,5,8-10 file1 a11a a1 b21b b2 c31c c3 > cut -d" " -f2,4 file1 a12 a14 b22 b24 c32 c34 במידה וקיים התו המפריד בשורה אך ניתן מספר שדה שאינו קיים - תודפס שורה ריקה אולם אם התו המפריד לא קיים בשורה, תודפס כל השורה > less file2 a11:a12:a13 b21:b22 c31 c32 c33 > cut -d":" –f1 file2 a11 b21 c31 c32 c33 > cut -d":" –f3 file2 a13 c31 c32 c33 30
31
הפקודה wc wc [options] [files] מספר התוויםהמיליםהשורותמדפיסה מספר התווים, המילים או השורות בקלט אופציות : התווים -c הדפס את מספר התווים בלבד. השורות -l הדפס את מספר השורות בלבד. המילים -w הדפס את מספר המילים בלבד. 31
32
הפקודה wc - דוגמאות באף אופציהבפורמטאם לא משתמשים באף אופציה, הפלט מודפס בפורמט הבא : filename כמה קבצי קלטסיכוםאם הפקודה מופעלת על כמה קבצי קלט, היא מדפיסה גם סיכום : > wc -w war_and_peace 590234 war_and_peace > wc -l war_and_peace 55480 war_and_peace > wc -c war_and_peace 3348543 war_and_peace > wc mtm_ex1.h 120 641 4161 mtm_ex1.h > wc mtm_ex1.h parsing_example.c 120 641 4161 mtm_ex1.h 136 692 4543 parsing_example.c 256 1333 8704 total 32
33
תוכנה חומרה מערכת הפעלה Shell SHELL Shell מעטפתממשק שורת הפקודה command line interface Shell ( מעטפת ) - תוכנית שמספקת ממשק שורת הפקודה (command line interface) למערכת ההפעלה 33 משתמש
34
Shells in UNIX תוכנית כמה תוכניות shell shell היא תוכנית ככל התוכניות. ב -Unix קיימות כמה תוכניות shell שונות, שפותחו בזמנים שונים סינטקסלכל shell יש סינטקס שונה יתרונות וחסרונותלכל shell יש יתרונות וחסרונות משלה נפוצים shells נפוצים ב -Unix: cshell,bash, kshell C Shellאנו נלמד על C Shell שהוא אחד ה -shells הפופולאריים tcsh –נשתמש בגרסה המורחבת של C shell שנקאת tcsh 34
35
Shells in UNIX איך יודעים מהו ה -shell שרץ עכשיו ? > echo $0 bash איך עוברים ל -shell אחר ? –פשוט מקישים את שם ה -shell בשורת הפקודה ( הרי shell היא תוכנית כמו כל התכניות ) > tcsh > echo $0 tcsh 35
36
תפקידיו של ה - SHELL התפקיד ממשק נוח כוח רבהתפקיד הראשון של ה -shell הוא לספק ממשק שורת פקודה נוח שמקנה כוח רב למשתמש משתמש האינטליגנטי –במיוחד למשתמש האינטליגנטי –תפקיד נוסף הוא לספק סביבת ריצה לתסריטים - יילמד בתרגול הבא ה -shell מאפשר כינויים לפקודות –להגדיר כינויים נוחים לפקודות –לחזור על הפקודות –לחזור על הפקודות שבוצעו –להתייחס למספר קבצים –להתייחס למספר קבצים בצורה קצרה ונוחה משתנים –להגדיר משתנים ולהשתמש בהם בשורת הפקודה 36
37
הפקודה :alias מנגנון נתינת כינויים לפקודות alias alias נותנת את השם new name לפקודה command עם הפרמטרים דוגמאות : > alias cdex1 cd ~mtm/public/0809b/ex1 > cdex1 > alias GCC gcc -std=c99 -Wall -pedantic-errors - Werror -DNDEBUG > GCC hello.c -o hello 37 מתבצע cd ~mtm/public/0809b/ex1 מתבצע gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG hello.c -o hello
38
הפקודה alias בלי פרמטרים כל הכינויםהפקודה alias בלי פרמטרים מדפיסה את כל הכינוים הידועים : > alias GCC (gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG) cdex1 (cd /u/023/mtm/public/0809b/ex1) לבטל unaliasניתן לבטל כינוי על ידי הפקודה unalias > unalias GCC > alias cdex1 (cd /u/023/mtm/public/0809b/ex1) 38
39
File name expansion לכמה קבצים תבנית השמות shell מאפשר להתייחס לכמה קבצים ע '' י ציון תבנית השמות שלהם *.c –למשל תבנית *.c מתייחסת לכל קבצי.c בתיקייה הנוכחית הפקודות ב -UNIX כמה קבציםרב הפקודות ב -UNIX מקבלות כפרמטרים שמות של כמה קבצים, לכן התכונה הזאת מועילה ביותר –למשל הפקודה *.h grep TODO *.c תדפיס שורות המכילות מחרוזת "TODO" בכל קבצי.h ו -.c בתיקיה הנוכחית –הפקודה gcc *.c תקמפל את כל קבצי.c בתיקיה הנוכחית –נחסכת הקלדה –נחסכת הקלדה של כל שמות הקבצים 39
40
File name expansion את התבנית בונים בעזרת תווים הנקראים Wildcards – * מתאים לכל מחרוזת תווים באורך אפס או יותר – ? מתאים לכל תו בודד אחד – [] מתאים לכל אחד מהתווים בין [ ל - ] – {} הרחבה למספר מחרוזות ללא קשר לקבצים בתיקיה x{aa,bb,cc}y -> xaay, xbby, xccy a[rxz]b -> arb, axb, azb 40
41
-File name expansion דוגמאות 41 > ls test17.err test17.out test1.in test2.err test2.out test3.in test17.in test1.err test1.out test2.in test3.err test3.out > ls test{17,2}.in test17.in test2.in > ls *1* test17.err test17.in test17.out test1.err test1.in test1.out > ls test?.in test1.in test2.in test3.in > ls test[1,3].in test1.in test3.in > ls test[1-3].in test1.in test2.in test3.in > echo W{hat,e,ant} What We Want
42
משתנים משתניםב -CShell ניתן הגדיר משתנים ( כמו בשפת C) אין צורך להכריזלהבדיל משפת C, אין צורך להכריז על משתני CShell מוגדרים מציביםפעם ראשונה –המשתנים מוגדרים ברגע שמציבים להם ערכים פעם ראשונה set = set = הפקודה set מציבה ערך לתוך משתנה קיים קודם אחרי קיים ומכיל את הערך –בין אם המשתנה היה קיים קודם ובין אם לא, אחרי ההצבה הוא קיים ומכיל את הערך שהוצב לתוכו 42
43
משתנים לקרוא להוסיף $להבדיל משפת C, כדי לקרוא ערך של משתנה לא מספיק לציין את שמו - חייבים להוסיף $ לפני השם של משתנה unsetניתן לבטל משתנה בצורה מפורשת על ידי הפקודה unset –לא משתמשים בזה לעיתים תכופות 43 > echo $A A: Undefined variable. > set A = 17 > echo $A 17 >echo A A > set A = 777 > echo $A 777 > unset A > echo $A A: Undefined variable.
44
ערכים של משתנים טיפוס אחדלהבדיל משפת C, שבה יש כמה טיפוסים של משתנים, ב -CShell יש רק טיפוס אחד כל משתנה ב -CShell יכול להכיל –מספר שלם –מחרוזת –רשימה 44 > set A = 17 > echo $A 17 > set A = Matam > echo $A Matam
45
פעולות על משתנים מספריים מספרים שלמים פעולות חשבוןב - CShell ניתן להשתמש במשתנים המכילים מספרים שלמים ולבצע עליהם פעולות חשבון פשוטות : +,-,*,/,%,++,-- לשים סימן @כדי לבצע פעולת חשבון חייבים לשים סימן @ בתחילת השורה מוגדר מציביםפעם ראשונה –גם בשורות עם @ המשתנה מוגדר ברגע שמציבים בו ערך פעם ראשונה 45 > set i = 3 > echo $i 3 > @ i = $i + 1 > echo $i 4 > @ i ++ > echo $i 5 > echo $v v: Undefined variable. > @ v = $i + 12 > echo $v 17
46
פעולות על משתנים מספריים - רווחים שימו לב : ישלשים רווחשימו לב : יש לשים רווח –אחרי @ לפני ואחרי כל מספר או משתנה –לרוב, לפני ואחרי כל מספר או משתנה לא חייבים לפני ואחרי = לא חייבים לפני ++,-- 46 > @i++ @i++: Command not found. > @ j = 2+ $i @: Badly formed number. > @ j = 2 +$i @: Variable name must begin with a letter. > @ j = $i +2 @: Variable name must begin with a letter. > @ j = $i+ 2 @: Badly formed number.
47
פעולות על משתנים מספריים השמת מספרהשמת מספר היא גם פעולת חשבון - ניתן לבצע אותה עם סימן @ פעולת חשבון מחרוזתאם מפעילים פעולת חשבון על מחרוזת - מקבלים שגיאה –בפרט עם משתמשים ב -@ להצבת מחרוזת 47 > @ i = 3 > echo $i 3 > set i = Matam > @ i++ @: Expression Syntax. > @ set i = Matam @: Expression Syntax.
48
פעולות על משתנים מספריים רק על שלמיםפעולות חשבון - רק על שלמים לא ניתן לשלבלא ניתן לשלב פעולת חשבון עם פעולה אחרת, חוץ מאשר בתנאי ב -if ו -while –אין משמעות ל -pre ו -post ++, כמו ב -C 48 > set i = 7 > @ echo ($i + 2) @: Unknown operator. > echo ($i + 2) (7+2) > set i = 1.7 > @ i++ @: Badly formed number. > @ j = $i++ @: Badly formed number. > @ ++i @: Variable name must begin with a letter. > if ($i + 2 > 8) echo yes yes
49
פעולות על משתנים מספריים - סוגריים בסוגרייםניתן להשתמש בסוגריים בפעולות חשבון האסוציאטיביות אינה סטנדרטיתשימו לב : האסוציאטיביות אינה סטנדרטית 49 > @ i = 2 - 3 + 4 > echo $i -5 > @ i = (2 - 3) + 4 > echo $i 3
50
מחרוזות יותר ממילה אחת רווחים גרשיים "ב - CShell, כל רצף של תווים נקרא מחרוזת, אולם אם רוצים לעבוד עם מחרוזות המכילות יותר ממילה אחת ( מכילות רווחים ) יש לתחום אותן בין גרשיים " 50 > set A = abc def ghi > echo $A abc > set A = "abc def ghi" > echo $A abc def ghi
51
רשימות רשימה a[i]עבור משתנה a המכיל רשימה, הביטוי a[i] מציין את האיבר ה -i ברשימה –בדומה למערך ב -C מספור מתחיל מ 1-ב cshell- מספור האיברים ברשימה a מתחיל מ 1- –ולא מ -0, להבדיל מהמערכים ב -C cshell לא תומך ברשימות מקוננות ( רשימה בתוך רשימה ) > set v = (123 layla tov) > echo $v 123 layla tov > echo $v[2] layla > set v[2] = boker > echo $v 123 boker tov > echo $v[4] v: Subscript out of range. 51 >set v[3] = (1 2 3) set: syntax error
52
פעולות על רשימות הביטוי ${#a} מציין את מספר האיברים ברשימה –ערכו 1 עבור המשתנים שהן לא רשומות תת - רשימהבהינתן רשימה a, ניתן לציין תת - רשימה שלה על ידי הביטויים הבאים : a[m-n] מהאיבר ה -m עד לאיבר ה -n a[-n] מהאיבר הראשון עד לאיבר ה -n a[m-] מהאיבר ה -m עד לאיבר האחרון 52 > set a = ( aa bb cc dd ee ) > echo $#a 5 >echo $a[3-] cc dd ee >echo $a[2-4] bb cc dd > echo $a[-3] aa bb cc
53
פעולות על רשימות - shift shift shift מזיזה שמאלהמזיזה את כל איברי הרשימה < <list מקום אחד שמאלה ומבטלת את האיבר הראשון. > set v = ( go to the beach ) > echo $v[1] go > shift v > echo $v[1] to > echo $v to the beach 53
54
משתנים : נקודות נוספות כל משתנה רשימה בת איבר אחדניתן להתייחס לכל משתנה ב - Cshell כאל רשימה בת איבר אחד הבדלמחרוזת רשימהשימו לב להבדל בין מחרוזת לרשימה 54 > set A = 17 > echo $A 17 > echo $A[1] 17 >echo $#A 1 > set A = " aa bb cc” > echo $A aa bb cc >echo $#A 1 > echo $A[1] aa bb cc > echo $A[2] v: Subscript out of range > set A = (aa bb cc) > echo $A aa bb cc >echo $#A 3 > echo $A[1] aa > echo $A[2] bb
55
משתנים : נקודות נוספות לפרק מחרוזתניתן לפרק מחרוזת לרשימת המילים המופיעות בה ע " י השמת המחרוזת בתוך סוגריים. בסוגריים מסולסליםלהדגיש שמוניתן להשתמש בסוגריים מסולסלים בכדי להדגיש מהו שמו של משתנה. להצמיד מחרוזת –נחוץ כשאר רוצים להצמיד מחרוזת לערך של משתנה 55 > set A = " aa bb cc” > echo $A[1] aa bb cc >set A = ($A) > echo $A[1] aa > set A = xxx > echo ${A}yyy xxxyyy > echo $Ayyy Ayyy: Undefined variable.
56
מנגנון ההיסטוריה לחזור על הפקודותמנגנון המאפשר לחזור על הפקודות שבוצעו. !! מציין הפקודה האחרונה !! - מציין את הפקודה האחרונה !gcc מציין הפקודה האחרונה המתחילה !gcc - מציין את הפקודה האחרונה המתחילה ב - gcc history מדפיס רשימת הפקודות history - מדפיס את רשימת הפקודות שבוצעו. ניתן לקבוע את מספר הפקודות אותן ה -shell " זוכר אחורה " על ידי קביעת ערכו של המשתנה history ! מציין ! - מציין את הפקודה שמספרה n ברשימה מקשי החיציםבנוסף ה -shell מאפשר לבצע פקודות שבוצעו בעזרת מקשי החיצים ( למעלה / למטה ) >set history=100 מספר הפקודות הנזכרותהפקודה קובעת את מספר הפקודות הנזכרות ל -100 56
57
Command substitution לשתול פקודה בתוך מחרוזת או פקודה אחרתב -cshell ניתן לשתול פקודה בתוך מחרוזת או פקודה אחרת `מקיפים את הפקודה הנשתלת בגרשיים הפוכים ` backquotes backticks –המכונים באנגלית backquotes או backticks מבצע מחליף cshell מבצע את הפקודה הנשתלת ומחליף אותה ביחד עם הגרשיים ההפוכים במה שהיא הדפיסה > set A = “there are `ls | wc -l` files in `pwd` “ > echo $A there are 662 files in /usr/bin 57
58
Command substitution דוגמא בהינתן הקובץ farm_list שמכיל רשימת קבצים שמייצגים חוות ניתן לספור פרות בכל חווה שב -farm_list בשורה אחת : 58 farm1 farm2 > grep -c cow `cat farms_list` farm1:3 farm2:2
59
אופן הפעולה של CShell עובד בלולאה CShell עובד בלולאה : prompt –הצגת prompt –המתנה –המתנה לפקודה –טיפולהביצוע –טיפול בפקודה כולל הביצוע שלה מבני הנתוניםלצורך עבודתו CShell מנהל את מבני הנתונים הבאים : –רשימת ההיסטוריה –רשימת המשתנים –רשימת ה -aliases 59
60
CShell : טיפול בפקודה 1. ניתוח הפקודה 1. ניתוח הפקודה : הפקודה מופרדת למילים. התווים רווח ו -Tab משמשים כמפרידים בין מילים התווים newline,|, >,< מפרידים בין פקודות 2. עיבוד הפקודה 2. עיבוד הפקודה : ביצוע החלפות לקבלת פקודה פשוטה. מבוצעות החלפות היסטוריה, תבניות של שמות הקבצים, aliases, משתנים וכד ' 3. ביצוע הפקודה 3. ביצוע הפקודה : ביצוע הפקודה הפשוטה שהתקבלה אחרי העיבוד 60
61
עיבוד הפקודה 1. במידה והפקודה מכילה שימוש בפקודות קודמות ( ע " י השמוש בסימן !) מתבצע History Substitution. - שורת הפקודה שהתקבלה נשמרת ברשימת ההיסטוריה של הפקודות שבוצעו 2. אם המילה הראשונה בפקודה הנה שם של alias מתבצע alias substituion. 3. ביצוע variable substitution. 4. ביצוע File name substitution. 5.command substitution. ה back-quoted string (`... `) מוחלפת בתוצאת הפקודה בנוסף, CShell מבצע I/O redirection טיפול ב -pipeline 61
62
History Substitution כאשר מתבצעת החלפת ההיסטוריה, שורת הפקודה ( לאחר ההחלפה ) מודפסת למסך 62 >ls farm* farm1 farm2 farms_list > !! ls farm* farm1 farm2 farms_list > echo AAA AAA > set last_command = "the last command was !!" set last_command = "the last command was echo AAA" > echo $last_command the last command was echo AAA
63
ביצוע הפקודה : סוגי הפקודה Cshell מבצע את הפקודה בהתאם לסוג שלה. מבחינת CShell ישנם שני סוגים של פקודות : פקודות פנימיותפקודות פנימיות (build-in) של CShell עצמו. פקודות אלה מבצעות את משימות הבאות : –ניהול ההסטוריה –ניהול ההסטוריה (history) –ניהול המשתנים –ניהול רשימת המשתנים (set/unset/shift) –ניהול aliases –ניהול רשימת ה -aliases (alias/unalias) התיקייה הנוכחית –שינוי התיקייה הנוכחית (cd) –בקרת זרימה בתסריטים ( בתרגול הבא ) –ניהול תהליכים ( בתרגול הבא ) פקודות חיצוניותפקודות חיצוניות - כל פקודה שהיא לא פנימית. אלה יכולות להיות –תוכניות של משתמש –תוכניות שרות סטנדרטיות, כמו cat,ls,grep 63
64
ביצוע הפקודה : סוגי הפקודה הפקודות הפנימיותאת הפקודות הפנימיות CShell מבצע בעצמו הפקודות החיצוניותאת הפקודות החיצוניות CShell שולח למערכת ההפעלה לביצוע, יחד עם הארגומנטים שלהן שם הפקודההמלא CShell חייב לשלוח למערכת ההפעלה את שם הפקודה כולל המסלול המלא (full path name): השם המלא שולח כמו שהוא –אם המשתמש ציין את השם המלא של הפקודה, CShell שולח אותו כמו שהוא יחפש את הפקודה path –אם המשתמש ציין רק את השם של הפקודה ( בלי המסלול ), CShell יחפש את הפקודה בכל התיקיות המופיעות ברשימה של המשתנה path 64
65
חיפוש הפקודה למצוא פקודה whereניתן לבקש מ -CShell למצוא פקודה כלשהיא על ידי הפקודה where –כך ניתן לדעת לפני ביצוע הפקודה קיימתהאם פקודה כלשהיא קיימת במערכת הקבצים מצליח למצואהאם CShell מצליח למצוא אותה איפה נמצאתאיפה היא נמצאת ניתן להוסיף תיקיות לרשימת התיקיות לחיפוש פקודות –למשל הפקודה הבאה תוסיף את התיקיה ~/mybin > set path = ($path ~/mybin) 65 > where cat /bin/cat > where cd cd is a shell built-in > where where where is a shell built-in
66
סוגי גרשיים ` גרש הפוך ` - גרש הפוך (back quote) משמש לצורך command substitution גרשיים כפולים " - גרשיים כפולים (double quote) ' גרש יחיד ' - גרש יחיד (single quote) –משמשים כדי לגרום ל -CShell להתייחס למספר מילים ( מופרדות ברווחים וטאבים ) כאל מילה אחת –החלפת משתנים רק בתוך גרשיים כפולים –החלפת משתנים מתבצעת רק בתוך גרשיים כפולים – command substitution רק בתוך גרשיים כפולים – command substitution מתבצע רק בתוך גרשיים כפולים ` 66 > set a = AAA > echo “the value of a is $a” the value of a is AAA > echo ' the value of a is $a ' the value of a is $a > echo '`ls` ' > `ls `
67
גרשיים : File name expansion לא מתבצע File name expansion לא מתבצע בתוך גרשיים בודדים או כפולים : 67 > echo farm* farm1 farm2 farms_list > echo “farm* ” farm* > echo ' farm* ' farm*
68
Command Substitution: נקודות נוספות בונה רשימה CShell בונה רשימה ממה שהפקודה בתוך ה -backticks מדפיסה. הרשימה נבנת בצורה הבאה : לא בתוך גרשיים כפוליםרווחתו מעבר שורה מפריד 1. אם ה -backticks לא בתוך גרשיים כפולים, כל רווח, תו או סימן מעבר שורה מפריד בין האיברים ברשימה בתוך גרשיים כפוליםרק סימן מעבר שורה מפריד 2. אם ה -backticks בתוך גרשיים כפולים, רק סימן מעבר שורה מפריד בין האיברים ברשימה 68 > cat lines a b c d > set A = `cat lines` > echo $#A 4 > echo $A[1] a > echo $A[2] b > set A = "`cat lines`" > echo $#A 2 > echo $A[1] a b > echo $A[2] c d
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.