680 likes | 951 Views
תרגול 6. תוכניות שרות סטנדרטיות ב- UNIX C-Shell. לי-טל משיח litalma@cs.technion.ac.il נערך והורחב ע''י ודים אייזנברג. תוכניות שרות סטנדרטיות ב- UNIX. בכל מחשב בו מותקנת מערכת הפעלה מסוג Unix מותקנות בנוסף מספר תוכניות שרות (utilities) סטנדרטיות
E N D
תרגול 6 תוכניות שרות סטנדרטיות ב-UNIX C-Shell לי-טל משיח litalma@cs.technion.ac.il נערך והורחב ע''י ודים אייזנברג
תוכניות שרות סטנדרטיות ב- UNIX • בכל מחשב בו מותקנת מערכת הפעלה מסוג Unixמותקנות בנוסף מספר תוכניות שרות (utilities)סטנדרטיות • בפשטות נקראות גם פקודות (commands)סטנדרטיות • כל משתמש Unix יכול להריץ תוכניות אלה לצורך ביצוע המשימות שלו • ב-Unix ניתן לשלב בין תוכניות (שרות ורגילות) בשורת הפקודה בצורה נוחה • לבצע משימות מורכבות יחסית בשורת פקודה אחת • ריבוי התוכניות הסטנדרטיות וההרכבה הנוחה שלהן מקנים כוח רב למשתמש
הפקודה echo echo <parameters> • מדפיסה את הפרמטרים שלה >echo Hello world ! Hello world !
פקודות לעיבוד קבצים • נלמד מספר פקודות לעיבוד קבצים ב-Unix • עיבוד קבצים: • הדפסת תוכן קבצים • הדפסת שורות מסוימות מקבצים • הדפסת קבצים בצורה ממוינת • הדפסת חלקי שורות מקבצים • ספירת שורות, מילים ותווים בקבצים
פורמט של רוב הפקודות לעיבוד קבצים command [options] [input files] • הפקודה מקבלת אופציות(דגלים), בד''כ כלל תו "-" ואות אחת • הפקודה מקבלת אחד או כמה קובצי קלט • אם לא ניתן אף קובץ קלט הפקודה מצפה לקלט מהקלט הסטנדרטי • הפקודה מוציאה את הפלט שלה לפלט הסטנדרטי
הפקודה head head [-N] [input files] • מדפיסה Nהשורות הראשונות מתוך הקלט • ברירת מחדל היא 10 • בהינתן הקבצים • a_file • b_file > head -2 a_file a line 1 a line 2 > head -1 < b_file b line 1 > head -2 a_fileb_file ==> a_file <== a line 1 a line 2 ==> b_file <== b line 1 b line 2 a line 1 a line 2 a line 3 a line 4 a line 5 b line 1 b line 2 b line 3
הפקודה tail tail -N [input files] • מדפיסה את Nהשורות האחרונות מתוך הקלט • ברירת המחדל היא 10 tail +N [input files] • מדפיסה את השורות האחרונות מתוך הקלט החל מהשורה N > 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
משימה פשוטה:להדפיס שורות 2 ו-3 של קובץ • איך עושים את זה בעזרת head ו-tail ? > head -3 > first3 > tail -2 first3 a line 2 a line 3 > rm first3 מסורבל
פתרון פשוט : שילוב בין תוכניות בעזרת pipeline • ב-Unix ניתן לשלבבין תוכניות בעזרת מגנון pipeline: > program1 | program2 | program3 • הפלט הסטנדרטי של command1מחובר לקלט הסטנדרטי של command2 בעזרת סימן 'I' command1 command2 command3 stdout stdin stdout stdin
Pipelining > program1 | program2 | program3 • כל תוכנית ב-pipelineלוקחת כקלט את הפלט של קודמתה, מבצעת את המשימה שלה ומעבירה את הפלט שלה לבאה אחריה בשורה. • פתרון של המשימה הקודמת בשורה אחת: > head -3 a_file | tail -2 a line 2 a line 3
פקודה cat cat file_1 file_2 … file_k • מדפיסה את תוכן הקבצים file_1,file_2,…,file_k לפלט הסטנדרטי אחד אחרי השני • דוגמא : > cat b_filea_file | head -4 b line 1 b line 2 b line 3 a line 1
הפקודה less less <input file> • מציגה את הקובץ על המסך עם הפסקה אחרי כל דף • ניתן לדפדף קדימה ואחורה בקובץ המוצג בעזרת מקשי החצים • ניתן לחפש מחרוזת על ידי הקשת תו / ואחריו המחרוזת לחיפוש • יוצאים מהפקודה על ידי הקשת :q או Ctrl-c q
התנהגות הפקודה ls • הפקודה ls מדפיסה רשימת קבצים • צורת הפלט שונה בהתאם ליעד הפלט • אם הפלט מיועד למסךls מדפיסה את קבצים בשורות • אם הפלט מיועד לקובץ או ל-pipe, ls מדפיסה את הקבצים אחד בשורה > ls aaaccceee bbbddd > ls | cat aaa bbb ccc ddd eee > ls > out > less out aaa bbb ccc ddd eee
הפקודה tee tee [options][files] • הפקודה משכפלתאת כל מה שנכנס לקלט הסטנדרטי שלה ושולחתאותו הן לפלט הסטנדרטי והן לכל אחד מהקבצים ב [files] • לדוגמא, אם בנוסף להצגת השורה השנייה והשלישית נרצה לשמור את שלוש השורות הראשונות של הקובץ a_fileבשני קבצים שונים, נוכל לבצע : • אופציות נוספות: • האופציה -a מאפשרת שרשור של הפלט לסוף הקבצים [files] במקום מחיקתם. > head –3 a_file | tee file1 file2 | tail –2
תיאור גרפי של הפעולה של tee From http://commons.wikimedia.org/wiki/File:Tee.svg, Creative Commons License
הפקודה tee tee [options][files] • שימו לב שהפקודה tee היא לא בפורמט הסטנדרטי של פקודות לעיבוד קבצים: • היא מקבלת את הקלט רק מהקלט הסטנדרטי • היא מקבלת רשימת הקבצים לפלט, ולא לקלט From http://commons.wikimedia.org/wiki/File:KF_25_Tee.jpg Creative Commons License
הפקודה sort sort [options] [files] • מדפיסה את תוכן הקלט בצורה ממוינת • בררת מחדל: מיון לקסיקוגרפי • אופציות: • -n ממיין בסדר מספרי • -rהופךאת סדר המיון • -k numמתייחסלכל שורה החל ממילה num, המילים ממוספרות החל מ-1 • -f מתעלם מהבדליuppercase/lowercase • -mממזגמספר קבצים שכבר מויינו לקובץ אחד (יותר יעיל מאשר למיין אותם שוב כקובץ אחד) • -b מתעלם מרווחים בתחילת השורה • -d מתעלם מסימני פיסוק
הפקודה 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 >
סדר מילוני לעומת מספרי • חשובלהבדילבין הסדר המילוני(לקסיקוגרפי) והסדר המספרי > less numbers 22 111 3 > sort numbers 111 22 3 > sort numbers -n 3 22 111
הפקודה grep grep [options] [^]word [files] • מדפיסה שורות בהן מופיעה המילה word • אופציות: • -v הדפס את השורות, בהן לא מופיעה word (פעולה הפוכה) • -i התעלם מהבדלי uppercase/lowercase • -w הדפס את כל השורות בהן מופיעהwordבדיוק(לא כתת מחרוזת)
הפקודה - grepדוגמאות > grep cow farm1 cow Betsy slim cow Dazy two cows Dartsy & Teo • בהינתן הקובץ • farm1 goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral > 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
הפקודה - grepנקודות נוספות • אם רוצים לחפש שורות בהן מופיע ביטויהמורכב ממספר מילים המופרדות ע"י רווחים, כותבים את הביטוי בין גרשיים: > grep "slim cow" file • כשסימן ^ מופיע לפני המילה, grep מדפיסה את כל השורות המתחילות במילה הזאת: > grep ^cow file
הפקודה - 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
הפקודה grep - אופציות נוספות • -n הדפס את השורות ואת מספרן בקבצים • -l הדפס רק את שמות הקבצים בהם השורות נמצאו ללא הדפסת השורותעצמן • -c הדפס רק את כמות השורות שנמצאו בכל קובץ ללא הדפסת השורותעצמן
הפקודה - grepדוגמאות > grep cow farm1 farm2 farm1:cow Betsy farm1:slim cow Dazy farm1:two cows Dartsy & Teo farm2:cow Leni farm2:cow Oreo • בהינתן הקבצים • farm1 • farm2 goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral > 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 sheep Brook cow Leni goat Aster cow Oreo > grep -c cow farm1 farm2 farm1:3 farm2:2
הפקודה uniq uniq [options] [input_file [output_file]] • מדפיסה עותק אחד של כל השורות הזהות הסמוכות • הפלט הולך לקובץ output_file (או בהיעדר הקובץ output_file, לערוץ הפלט הסטנדרטי) • שימו לב שהפקודה uniqהיא לא בפורמט הסטנדרטי של פקודות לעיבוד קבצים: • היא יכולה לקבל את הקלט רק מקובץ אחד • הקובץ השני הוא קובץ הפלט
הפקודה uniq - אופציות • -c הדפס כל שורה פעם אחת בלבד וספור עותקים של כל שורה. • -d הדפס רקשורות המופיעות יותר מפעם אחת • -u הדפס רקשורות המופיעות מפעם אחת בלבד • ניתן להשתמש רק באחת מהאופציות -c/-d/-u בו זמנית • -Nהתעלםמ- “N”המילים הראשונות (לפני קבלת ההחלטה אם שתי שורות זהות)
הפקודה uniq - דוגמאות > less names Uri Dan Uri Elena Alex Ofra Uri Ofra > less file3 one two two three three three one one > uniq file3 list > less list one two three one > > 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
הפקודה cut cut options [files] • מדפיסה תוויםאו שדותמכל אחת משורותהקלט • אופציות: • -c list הוצא קבוצת תוויםלפי האינדקסים של התווים בשורה, המופיעים ב-“list” • -f list הוצא קבוצת שדות לפי האינדקסים של השדות בשורה, המופיעים ב-“list”. • שדותבשורה - קבוצות תווים המופרדותע''יתו מפריד כלשהו. • ברירת מחדל של התו המפריד היא <tab> • -d”c” משמשת בנוסף לאופציה -f ומאפשרת לקבועאת “c” כתו המפריד
הפקודה 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
הפקודה wc wc [options] [files] • מדפיסה מספר התווים, המילים או השורות בקלט • אופציות: • -c הדפס את מספר התוויםבלבד. • -l הדפס את מספר השורותבלבד. • -w הדפס את מספר המיליםבלבד.
הפקודה wc - דוגמאות > wc -w war_and_peace 590234 war_and_peace > wc -l war_and_peace 55480 war_and_peace > wc -c war_and_peace 3348543war_and_peace • אם לא משתמשים באף אופציה, הפלט מודפס בפורמטהבא:<# lines> <# words> <# chars> filename • אם הפקודה מופעלת על כמה קבצי קלט, היא מדפיסה גם סיכום: > 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
SHELL • Shell(מעטפת) - תוכנית שמספקת ממשק שורת הפקודה(command line interface) למערכת ההפעלה משתמש תוכנה Shell מערכת הפעלה חומרה
Shells in UNIX • shell היא תוכניתככל התוכניות. ב-Unix קיימות כמה תוכניות shellשונות, שפותחו בזמנים שונים • לכל shell יש סינטקסשונה • לכל shell יש יתרונות וחסרונות משלה • shellsנפוציםב-Unix: cshell,bash, kshell • אנו נלמד על C Shellשהוא אחד ה-shells הפופולאריים • נשתמש בגרסה המורחבת של C shellשנקאתtcsh
Shells in UNIX • איך יודעים מהו ה-shell שרץ עכשיו ? > echo $0 bash • איך עוברים ל-shell אחר ? • פשוט מקישים את שם ה-shell בשורת הפקודה (הרי shell היא תוכנית כמו כל התכניות) > tcsh > echo $0 tcsh
תפקידיו של ה- SHELL • התפקידהראשון של ה-shell הוא לספק ממשקשורת פקודה נוחשמקנה כוח רב למשתמש • במיוחד למשתמש האינטליגנטי • תפקיד נוסף הוא לספק סביבת ריצה לתסריטים - יילמד בתרגול הבא • ה-shell מאפשר • להגדיר כינוייםנוחים לפקודות • לחזור על הפקודות שבוצעו • להתייחס למספר קבצים בצורה קצרה ונוחה • להגדיר משתניםולהשתמש בהם בשורת הפקודה
הפקודה :aliasמנגנון נתינת כינויים לפקודות alias <new name> <command + parameters> • נותנת את השם 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 מתבצע cd ~mtm/public/0809b/ex1 מתבצע gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG hello.c -o hello
הפקודה alias • הפקודה aliasבלי פרמטרים מדפיסה את כל הכינויםהידועים: > alias GCC (gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG) cdex1 (cd /u/023/mtm/public/0809b/ex1) • ניתן לבטלכינוי על ידי הפקודה unalias > unalias GCC > alias cdex1 (cd /u/023/mtm/public/0809b/ex1)
File name expansion • shell מאפשר להתייחס לכמה קבצים ע''י ציון תבנית השמות שלהם • למשל תבנית *.c מתייחסת לכל קבצי .c בתיקייה הנוכחית • רב הפקודות ב-UNIX מקבלות כפרמטרים שמות של כמה קבצים, לכן התכונה הזאת מועילה ביותר • למשל הפקודה*.h grep TODO *.cתדפיס שורות המכילות מחרוזת "TODO" בכל קבצי .h ו-.c בתיקיה הנוכחית • הפקודה gcc *.cתקמפל את כל קבצי .c בתיקיה הנוכחית • נחסכת הקלדה של כל שמות הקבצים
File name expansion • את התבנית בונים בעזרת תווים הנקראים Wildcards • * מתאים לכל מחרוזת תווים באורך אפס או יותר • ? מתאים לכל תו בודד אחד • [] מתאים לכל אחד מהתווים בין [ ל- ] • {} הרחבה למספר מחרוזות • ללא קשר לקבצים בתיקיה a[rxz]b -> arb, axb, azb x{aa,bb,cc}y -> xaay, xbby, xccy
-File name expansionדוגמאות > 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 *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 > ls test{17,2}.in test17.in test2.in > echo W{hat,e,ant} What We Want
משתנים • ב-CShell ניתן הגדיר משתנים(כמו בשפת C) • להבדיל משפת C, אין צורך להכריז על משתני CShell • המשתנים מוגדריםברגע שמציבים להם ערכים פעם ראשונה set <variable> = <value> • הפקודה set מציבה ערך <value> לתוך משתנה <variable> • בין אם המשתנה היה קיים קודם ובין אם לא, אחריההצבה הוא קיים ומכיל את הערך שהוצב לתוכו
משתנים • להבדיל משפת C, כדי לקרואערך של משתנה לא מספיק לציין את שמו - חייבים להוסיף $לפני השם של משתנה • ניתן לבטל משתנה בצורה מפורשת על ידי הפקודה unset • לא משתמשים בזה לעיתים תכופות > 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.
ערכים של משתנים • להבדיל משפת C, שבה יש כמה טיפוסים של משתנים, ב-CShell יש רק טיפוס אחד • כל משתנה ב-CShell יכול להכיל • מספר שלם • מחרוזת • רשימה > set A = 17 > echo $A 17 > set A = Matam > echo $A Matam
פעולות על משתנים מספריים • ב - CShell ניתן להשתמש במשתנים המכילים מספרים שלמים ולבצע עליהם פעולות חשבון פשוטות: +,-,*,/,%,++,-- • כדי לבצע פעולת חשבון חייבים לשים סימן @ בתחילת השורה • גם בשורות עם @ המשתנה מוגדרברגע שמציבים בו ערך פעם ראשונה > 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
פעולות על משתנים מספריים - רווחים > @i++ @i++: Command not found. • שימו לב: ישלשים רווח • אחרי @ • לרוב, לפני ואחרי כל מספר או משתנה • לא חייבים לפני ואחרי = • לא חייבים לפני ++,-- > @ j = 2+ $i @: Badly formed number. > @ j = $i+ 2 @: Badly formed number. > @ j = 2 +$i @: Variable name must begin with a letter. > @ j = $i +2 @: Variable name must begin with a letter.
פעולות על משתנים מספריים • השמת מספר היא גם פעולת חשבון - ניתן לבצע אותה עם סימן @ • אם מפעילים פעולת חשבון על מחרוזת- מקבלים שגיאה • בפרט עם משתמשים ב-@ להצבת מחרוזת > @ i = 3 > echo $i 3 > set i = Matam > @ i++ @: Expression Syntax. > @ set i = Matam @: Expression Syntax.
פעולות על משתנים מספריים > set i = 1.7 > @ i++ @: Badly formed number. • פעולות חשבון - רק על שלמים • לא ניתן לשלב פעולת חשבון עם פעולה אחרת, חוץ מאשר בתנאי ב-if ו-while • אין משמעות ל-pre ו-post ++, כמו ב-C > set i = 7 > @ echo ($i + 2) @: Unknown operator. > echo ($i + 2) (7+2) > if ($i + 2 > 8) echo yes yes > @ j = $i++ @: Badly formed number. > @ ++i @: Variable name must begin with a letter.
פעולות על משתנים מספריים - סוגריים > @ i = 2 - 3 + 4 > echo $i -5 • ניתן להשתמש בסוגרייםבפעולות חשבון • שימו לב:האסוציאטיביות אינה סטנדרטית > @ i = (2 - 3) + 4 > echo $i 3
מחרוזות • ב - CShell, כל רצף של תווים נקרא מחרוזת, אולם אם רוצים לעבוד עם מחרוזות המכילות יותר ממילה אחת (מכילות רווחים) יש לתחום אותן בין גרשיים" > set A = abc def ghi > echo $A abc > set A = "abc def ghi" > echo $A abc def ghi