6תרגול
UNIXתוכניות שרות סטנדרטיות ב-C-Shell
[email protected]לי-טל משיח
נערך והורחב ע''י ודים אייזנברג
UNIX תוכניות שרות סטנדרטיות ב- UnixUnixבכל מחשב בו מותקנת מערכת הפעלה מסוג •
((utilitiesutilities))תוכניות שרות תוכניות שרות מותקנות בנוסף מספר סטנדרטיותסטנדרטיות
סטנדרטיות ((commandscommands))פקודות פקודות בפשטות נקראות גם – יכול להריץ תוכניות אלה לצורך Unixכל משתמש •
ביצוע המשימות שלו)שרות ורגילות( לשלב בין תוכניות לשלב בין תוכניות ניתן Unixב-•
בצורה נוחהבשורת הפקודה בשורת הפקודה בשורת פקודה אחתבשורת פקודה אחתיחסית משימות מורכבות משימות מורכבות לבצע –
התוכניות הסטנדרטיות וההרכבה הנוחההתוכניות הסטנדרטיות וההרכבה הנוחהריבוי •כוח רב למשתמשכוח רב למשתמשן מקנים שלהשלה
22
echoהפקודה
echo <parameters>echo <parameters>מדפיסה את הפרמטרים שלה•
33
>echo Hello world !Hello world !>echo Hello world !Hello world !
פקודות לעיבוד קבצים
Unixנלמד מספר פקודות לעיבוד קבצים ב-•
עיבוד קבצים:•קבציםתוכן תוכן הדפסת –מקבציםשורות מסוימות שורות מסוימות הדפסת –בצורה ממוינתבצורה ממוינתהדפסת קבצים –מקבציםחלקי שורות חלקי שורות הדפסת –, מילים ותווים בקבצים ספירת שורותספירת שורות–
44
פורמט של רוב הפקודות לעיבוד קבצים
command [options] [input files]command [options] [input files])דגלים(, בד''כ כלל אופציותאופציותהפקודה מקבלת •
תו "-" ואות אחת
קובצי קלטקובצי קלטהפקודה מקבלת אחד או כמה •
אם לא ניתן אף קובץ קלט הפקודה מצפה •הקלט הסטנדרטיהקלט הסטנדרטילקלט מ
פלט פלט הפקודה מוציאה את הפלט שלה ל•הסטנדרטיהסטנדרטי
55
headהפקודה head [-N] [input files]head [-N] [input files]
מתוך הקלטהשורות הראשונות Nמדפיסה •10ברירת מחדל היא –בהינתן הקבצים –
•a_file
•b_file
66
a line 1a line 2a line 3a line 4a line 5
a line 1a line 2a line 3a line 4a line 5
b line 1b line 2b line 3
b line 1b line 2b line 3
> head -2 a_filea line 1a line 2> head -1 < b_fileb line 1> head -2 a_file b_file==> a_file <==a line 1a line 2
==> b_file <==b line 1b line 2
> head -2 a_filea line 1a line 2> head -1 < b_fileb line 1> head -2 a_file b_file==> a_file <==a line 1a line 2
==> b_file <==b line 1b line 2
tailהפקודה
tail -N [input files]tail -N [input files]מתוך השורות האחרונות NNמדפיסה את •
הקלט10ברירת המחדל היא –
tail +N [input files]tail +N [input files]מתוך הקלט השורות האחרונות מדפיסה את •
NNהחל מהשורה החל מהשורה
77
> tail -2 a_filea line 4a line 5
> tail -2 a_filea line 4a line 5
> tail +2 a_filea line 2a line 3a line 4a line 5
> tail +2 a_filea line 2a line 3a line 4a line 5
3 ו-2להדפיס שורות משימה פשוטה:של קובץ
?tail ו-headאיך עושים את זה בעזרת •
> head -3 > first3> tail -2 first3a line 2a line 3> rm first3
> head -3 > first3> tail -2 first3a line 2a line 3> rm first3
מסורבל
88
פתרון פשוט : שילוב בין תוכניות pipelineבעזרת
בין תוכניות בעזרת מגנון לשלבלשלב ניתן Unixב-•pipelinepipeline:
> program1 | program2 | program3> program1 | program2 | program3מחובר מחובר command1 הסטנדרטי של הפלטהפלט•
בעזרת סימן command2הסטנדרטי של לקלט לקלט ''II''
99
Pipelining
> program1 | program2 | program3> program1 | program2 | program3את לוקחת כקלט לוקחת כקלט pipelineכל תוכנית ב-•
, מבצעת את המשימה הפלט של קודמתההפלט של קודמתהלבאה אחריה לבאה אחריה הפלט שלה שלה ומעבירה את
בשורה.head -3 a_file | tail -2 <פתרון של המשימה הקודמת בשורה אחת:–
a line 2a line 3
> head -3 a_file | tail -2a line 2a line 3
1010
catפקודה
cat file_1 file_2 … file_k cat file_1 file_2 … file_k ,file_1,file_2מדפיסה את תוכן הקבצים •
…,file_k אחד אחרי השניאחד אחרי השני לפלט הסטנדרטי
cat b_file a_file | head -4 <דוגמא : •b line 1b line 2b line 3a line 1
> cat b_file a_file | head -4b line 1b line 2b line 3a line 1
1111
lessהפקודה
less <input file>less <input file>עם הפסקה אחרי עם הפסקה אחרי מציגה את הקובץ על המסך •
כל דףכל דףבקובץ המוצג בעזרת לדפדף קדימה ואחורה לדפדף קדימה ואחורה ניתן –
מקשי החצים ואחריו / מחרוזת על ידי הקשת תו לחפשלחפשניתן –
המחרוזת לחיפושCtrl-c q או q:יוצאים מהפקודה על ידי הקשת –
1212
lsהתנהגות הפקודה
מדפיסה רשימת קבציםlsהפקודה •
הפלט שונה בהתאם ליעד הפלט שונה בהתאם ליעד צורת •הפלט
מדפיסה את ls למסךלמסךאם הפלט מיועד –בשורותבשורותקבצים
pipepipe, lsלקובץ או ל-לקובץ או ל-אם הפלט מיועד –אחד בשורהאחד בשורהמדפיסה את הקבצים
> lsaaa ccc eeebbb ddd
> lsaaa ccc eeebbb ddd
> ls | cataaabbbcccdddeee
> ls | cataaabbbcccdddeee
> ls > out> less outaaabbbcccdddeee
> ls > out> less outaaabbbcccdddeee
1313
teeהפקודה
tee [options][files] tee [options][files] את כל מה שנכנס לקלט משכפלתמשכפלתהפקודה •
לפלט הסטנדרטי לפלט הסטנדרטי אותו הן ושולחתושולחתהסטנדרטי שלה [files]ב לכל אחד מהקבצים לכל אחד מהקבצים והן
לדוגמא, אם בנוסף להצגת השורה השנייה •והשלישית נרצה לשמור את שלוש השורות
בשני קבצים שונים, נוכל a_file הראשונות של הקובץ לבצע :
אופציות נוספות:• של הפלט לסוף הקבצים שרשורשרשור מאפשרת a-האופציה –
[files].במקום מחיקתם
> head –3 a_file | tee file1 file2 | tail –2> head –3 a_file | tee file1 file2 | tail –2
1414
teeתיאור גרפי של הפעולה של
1515
From From http://commons.wikimedia.org/wiki/File:Tee.svg, Creative Commons License, Creative Commons License
teeהפקודה
tee [options][files] tee [options][files] לא בפורמט לא בפורמט היא teeשימו לב שהפקודה •
הסטנדרטי של פקודות לעיבוד קבצים:רק מהקלט הסטנדרטירק מהקלט הסטנדרטיהיא מקבלת את הקלט –, ולא לקלטהקבצים לפלטהקבצים לפלטהיא מקבלת רשימת –
1616
From From http://commons.wikimedia.org/wiki/File:KF_25_Tee.jpg Creative Commons LicenseCreative Commons License
sortהפקודה
sort [options] [files]sort [options] [files]ממוינת ממוינת מדפיסה את תוכן הקלט בצורה •
מיון לקסיקוגרפי בררת מחדל:–אופציות:•
-n מספרימספרי ממיין בסדר-r את סדר המיון הופךהופך-k num החל ממילה החל ממילה לכל שורה מתייחסמתייחסnumnum המילים ,
1ממוספרות החל מ--fמתעלם מהבדלי uppercase/lowercaseuppercase/lowercase -m מספר קבצים שכבר מויינו לקובץ אחד )יותר יעיל ממזגממזג
מאשר למיין אותם שוב כקובץ אחד(-bרווחים בתחילת השורהרווחים בתחילת השורה מתעלם מ-d פיסוקפיסוק מתעלם מסימני
1717
- דוגמאותsortהפקודה > less data WorldwhouldforFather> sort dataFatherWorldforwhould> sort data -fFatherforwhouldWorld> sort data -rwhouldforWorldFather
> less data WorldwhouldforFather> sort dataFatherWorldforwhould> sort data -fFatherforwhouldWorld> sort data -rwhouldforWorldFather
> ls -altotal 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 5total 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>
> ls -altotal 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 5total 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>
1818
סדר מילוני לעומת מספרי
המילוניהמילוניבין הסדר להבדיללהבדיל חשובחשוב•המספריהמספרי)לקסיקוגרפי( והסדר
1919
> less numbers221113
> less numbers221113
> sort numbers111223
> sort numbers111223
> sort numbers -n322111
> sort numbers -n322111
grepהפקודה
grep [options] [^]word [files]grep [options] [^]word [files]wordמדפיסה שורות בהן מופיעה המילה •אופציות:•
-v לא מופיעה לא מופיעה הדפס את השורות, בהןword (פעולה הפוכהפעולה הפוכה)-i התעלם מהבדלי uppercase/lowercaseuppercase/lowercase-w מופיעהמופיעההדפס את כל השורות בהן word
)לא כתת מחרוזת( בדיוקבדיוק
2020
דוגמאותgrep - הפקודה
בהינתן הקובץ–•farm1
goat Uptoncow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teohorse Admiral
goat Uptoncow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teohorse Admiral
> grep cow farm1cow Betsyslim cow Dazytwo cows Dartsy & Teo
> grep cow farm1cow Betsyslim cow Dazytwo cows Dartsy & Teo
> grep -v cow farm1goat UptonFat Cow Burgerhorse Admiral
> grep -v cow farm1goat UptonFat Cow Burgerhorse Admiral
> grep -i cow farm1cow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teo
> grep -i cow farm1cow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teo
> grep -w cow farm1cow Betsyslim cow Dazy
> grep -w cow farm1cow Betsyslim cow Dazy
2121
נקודות נוספותgrep - הפקודה
ביטויביטויאם רוצים לחפש שורות בהן מופיע • המופרדות ע"י רווחים, מספר מיליםמספר מיליםהמורכב מ
כותבים את הביטוי בין גרשיים:
> grep "slim cow" file> grep "slim cow" file מדפיסה grep מופיע לפני המילה, ^כשסימן •
במילה הזאת:המתחילותאת כל השורות
> grep ^cow file> grep ^cow file
2222
דוגמאותgrep - הפקודה
בהינתן הקובץ–•farm1
goat Uptoncow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teohorse Admiral
goat Uptoncow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teohorse Admiral
> grep "slim cow" farm1slim cow Dazy> grep "slim cow" farm1slim cow Dazy
> grep ^cow farm1cow Betsy> grep ^cow farm1cow Betsy
2323
- אופציות נוספותgrepהפקודה
-n בקבציםהשורות ואת מספרן השורות ואת מספרן הדפס את-l בהם השורות שמות הקבציםשמות הקבצים הדפס רק את
עצמן השורותהשורותהדפסת ללא ללא נמצאו -c שנמצאו בכל כמות השורות כמות השורות הדפס רק את
עצמן השורותהשורותהדפסת ללא ללא קובץ
2424
דוגמאותgrep - הפקודה
בהינתן הקבצים –•farm1
•farm2
goat Uptoncow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teohorse Admiral
goat Uptoncow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teohorse Admiral
sheep Brookcow Lenigoat Astercow Oreo
sheep Brookcow Lenigoat Astercow Oreo
> grep cow farm1 farm2farm1:cow Betsyfarm1:slim cow Dazyfarm1:two cows Dartsy & Teofarm2:cow Lenifarm2:cow Oreo
> grep cow farm1 farm2farm1:cow Betsyfarm1:slim cow Dazyfarm1:two cows Dartsy & Teofarm2:cow Lenifarm2:cow Oreo
> grep -n cow farm1 farm2farm1:2:cow Betsyfarm1:3:slim cow Dazyfarm1:5:two cows Dartsy & Teofarm2:2:cow Lenifarm2:4:cow Oreo
> grep -n cow farm1 farm2farm1:2:cow Betsyfarm1:3:slim cow Dazyfarm1:5:two cows Dartsy & Teofarm2:2:cow Lenifarm2:4:cow Oreo
> grep -l cow farm1 farm2farm1farm2
> grep -l cow farm1 farm2farm1farm2
> grep -c cow farm1 farm2farm1:3farm2:2
> grep -c cow farm1 farm2farm1:3farm2:2
2525
uniqהפקודה
uniq [options] [input_file [output_file]]uniq [options] [input_file [output_file]]הזהות הזהות מדפיסה עותק אחד של כל השורות •
הסמוכותהסמוכות )או בהיעדר output_fileהפלט הולך לקובץ •
, לערוץ הפלט הסטנדרטי(output_fileהקובץ לא בפורמט לא בפורמט היא uniq שימו לב שהפקודה •
הסטנדרטי של פקודות לעיבוד קבצים:רק מקובץ אחדרק מקובץ אחדהיא יכולה לקבל את הקלט –הפלטהפלטהוא קובץ הקובץ השני הקובץ השני –
2626
- אופציותuniqהפקודה
•-cספור עותקיםספור עותקים הדפס כל שורה פעם אחת בלבד ו של כל שורה.
•-d יותר מפעם אחתיותר מפעם אחתשורות המופיעות רקרק הדפס•-u מפעם אחת בלבדמפעם אחת בלבדשורות המופיעות רקרק הדפס
בו זמניתc/-d/-u-ניתן להשתמש רק באחת מהאופציות •
•-N מ- התעלםהתעלם“ N” לפני המילים הראשונות המילים הראשונות(קבלת ההחלטה אם שתי שורות זהות(
2727
- דוגמאותuniq הפקודה > less file3onetwotwothreethreethreeoneone> uniq file3 list> less listonetwothreeone>
> less file3onetwotwothreethreethreeoneone> uniq file3 list> less listonetwothreeone>
> less namesUriDanUriElenaAlexOfraUriOfra
> less namesUriDanUriElenaAlexOfraUriOfra
2828
> sort names | uniq -c 1 Alex 1 Dan 1 Elena 2 Ofra 3 Uri
> sort names | uniq -c 1 Alex 1 Dan 1 Elena 2 Ofra 3 Uri
> sort names | uniq -dOfraUri
> sort names | uniq -dOfraUri> sort names | uniq
AlexDanElenaOfraUri
> sort names | uniqAlexDanElenaOfraUri
> sort names | uniq -uAlexDanElena
> sort names | uniq -uAlexDanElena
cutהפקודה
cut options [files]cut options [files]הקלט משורותמשורותמכל אחת שדותשדותאו תוויםתוויםמדפיסה •אופציות: •
-c list של התווים לפי האינדקסים לפי האינדקסים תוויםתווים הוצא קבוצת”list“בשורה, המופיעים ב-
-f list של השדות שדות לפי האינדקסים שדות לפי האינדקסים הוצא קבוצת. ”list“בשורה, המופיעים ב-
תו מפריד כלשהו. ע''י ע''י המופרדותהמופרדותבשורה - קבוצות תווים שדותשדות של התו המפריד היא ברירת מחדל ברירת מחדל<<tabtab>>
-d”c ” משמשת בנוסף לאופציה -f את לקבועלקבוע ומאפשרת“c” המפריד כתו
2929
- דוגמאותcutהפקודה
> less file1a11 a12 a13 a14 a15b21 b22 b23 b24 b25c31 c32 c33 c34 c35> cut -c1-3,5,8-10 file1a11a a1b21b b2c31c c3> cut -d" " -f2,4 file1a12 a14b22 b24c32 c34
> less file1a11 a12 a13 a14 a15b21 b22 b23 b24 b25c31 c32 c33 c34 c35> cut -c1-3,5,8-10 file1a11a a1b21b b2c31c c3> cut -d" " -f2,4 file1a12 a14b22 b24c32 c34
מספר שדה שאינו מספר שדה שאינו בשורה אך ניתן בשורה אך ניתן קיים התו המפרידקיים התו המפרידבמידה ובמידה ושורה ריקהשורה ריקה-תודפס -תודפס קיים קיים
כל השורהכל השורהבשורה, תודפס בשורה, תודפס התו המפריד לא קיים התו המפריד לא קיים אולם אם אולם אם
> less file2a11:a12:a13 b21:b22 c31 c32 c33 > cut -d":" –f1 file2a11b21 c31 c32 c33 > cut -d":" –f3 file2a13 c31 c32 c33
> less file2a11:a12:a13 b21:b22 c31 c32 c33 > cut -d":" –f1 file2a11b21 c31 c32 c33 > cut -d":" –f3 file2a13 c31 c32 c33
3030
wcהפקודה
wc [options] [files]wc [options] [files] השורותהשורות או המיליםהמילים, מספר התוויםמספר התוויםמדפיסה •
בקלט
אופציות:•-c בלבד. התוויםהתווים הדפס את מספר-l בלבד. השורותהשורות הדפס את מספר-w בלבד. המיליםהמילים הדפס את מספר
3131
- דוגמאותwcהפקודה
בפורמטבפורמט, הפלט מודפס באף אופציהבאף אופציהאם לא משתמשים •:הבא #<lines> <# words> <# chars> filename
, היא מדפיסה גם כמה קבצי קלטכמה קבצי קלטאם הפקודה מופעלת על •:סיכוםסיכום
> wc -w war_and_peace590234 war_and_peace> wc -l war_and_peace55480 war_and_peace> wc -c war_and_peace3348543 war_and_peace
> wc -w war_and_peace590234 war_and_peace> wc -l war_and_peace55480 war_and_peace> wc -c war_and_peace3348543 war_and_peace
> wc mtm_ex1.h 120 641 4161 mtm_ex1.h> 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
> wc mtm_ex1.h parsing_example.c 120 641 4161 mtm_ex1.h 136 692 4543 parsing_example.c 256 1333 8704 total
3232
•ShellShell (תוכנית שמספקת מעטפתמעטפת - ) ממשק ממשק (command line interfacecommand line interface) שורת הפקודהשורת הפקודה
למערכת ההפעלה
תוכנה
חומרה
מערכת הפעלה
Shell
SHELL
3333
משתמש
Shells in UNIX
•shell ככל התוכניות. ב- תוכניתתוכנית היאUnix קיימות שונות, שפותחו בזמנים shellshellכמה תוכניות כמה תוכניות
שונים
שונה סינטקססינטקס יש shellלכל •
משלהיתרונות וחסרונות יתרונות וחסרונות יש shellלכל •
•shells ב- נפוציםנפוציםUnix: cshell,bash, kshell shellsשהוא אחד ה- C ShellC Shellאנו נלמד על •
הפופולארייםtcshtcsh שנקאת C shellנשתמש בגרסה המורחבת של –
3434
Shells in UNIX
שרץ עכשיו ?shellאיך יודעים מהו ה-•> echo $0> echo $0bashbash
אחר ?shellאיך עוברים ל-• בשורת הפקודה )הרי shellפשוט מקישים את שם ה-–
shell)היא תוכנית כמו כל התכניות
> tcsh> tcsh> echo $0> echo $0tcshtcsh
3535
SHELL תפקידיו של ה-
ממשקממשק הוא לספק shellהראשון של ה- התפקידהתפקיד•למשתמשכוח רב כוח רב שמקנה נוחנוחשורת פקודה
משתמש האינטליגנטימשתמש האינטליגנטיבמיוחד ל–תפקיד נוסף הוא לספק סביבת ריצה לתסריטים - –
יילמד בתרגול הבא
מאפשרshellה-•לפקודותלפקודותנוחים כינוייםכינוייםלהגדיר –שבוצעולחזור על הפקודות לחזור על הפקודות –בצורה קצרה ונוחהלהתייחס למספר קבצים להתייחס למספר קבצים –ולהשתמש בהם בשורת הפקודה משתניםמשתניםלהגדיר –
3636
מנגנון נתינת כינויים alias :הפקודה לפקודות
alias <new name> <command + parameters>alias <new name> <command + parameters> עם command לפקודה new nameנותנת את השם •
הפרמטריםדוגמאות:•
> alias cdex1 cd ~mtm/public/0809b/ex1> cdex1> alias GCC gcc -std=c99 -Wall -pedantic-errors -
Werror -DNDEBUG> GCC hello.c -o hello
3737
מתבצע cd ~mtm/public/0809b/ex1
מתבצע gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG hello.c -o hello
aliasהפקודה כל כל מדפיסה את בלי פרמטרים בלי פרמטרים aliasהפקודה •
הידועים:הכינוים הכינוים > aliasGCC (gcc -std=c99 -Wall -pedantic-errors
-Werror -DNDEBUG)cdex1 (cd /u/023/mtm/public/0809b/ex1)
unaliasunaliasכינוי על ידי הפקודה לבטללבטלניתן •> unalias GCC> aliascdex1 (cd /u/023/mtm/public/0809b/ex1)
3838
File name expansion
•shell תבנית תבנית ע''י ציון לכמה קבצים לכמה קבצים מאפשר להתייחס שלהםהשמותהשמות
בתיקייה הנוכחיתc. מתייחסת לכל קבצי cc*.*.למשל תבנית –
מקבלות כפרמטרים שמות של UNIXUNIXהפקודות ב-הפקודות ב-רב •, לכן התכונה הזאת מועילה ביותרכמה קבציםכמה קבצים
תדפיס שורות המכילות h grep TODO *.c*.למשל הפקודה– בתיקיה הנוכחיתc. ו-h." בכל קבצי TODOמחרוזת "
בתיקיה הנוכחיתc.תקמפל את כל קבצי gcc *.cהפקודה –של כל שמות הקבציםנחסכת הקלדה נחסכת הקלדה –
3939
File name expansion
את התבנית בונים בעזרת תווים הנקראים •Wildcards
מתאים לכל מחרוזת תווים באורך אפס או יותר*– מתאים לכל תו בודד אחד?– מתאים לכל אחד מהתווים בין ] ל- [][–
הרחבה למספר מחרוזות}{–x{aa,bb,cc}y -> xaay, xbby, xccyללא קשר לקבצים בתיקיה •
a[rxz]b -> arb, axb, azb
4040
-File name expansionדוגמאות
4141
> lstest17.err test17.out test1.in test2.err test2.out test3.intest17.in test1.err test1.out test2.in test3.err test3.out
> lstest17.err test17.out test1.in test2.err test2.out test3.intest17.in test1.err test1.out test2.in test3.err test3.out
> ls test{17,2}.intest17.in test2.in
> ls test{17,2}.intest17.in test2.in
> ls *1*test17.err test17.in test17.out test1.err test1.in test1.out
> ls *1*test17.err test17.in test17.out test1.err test1.in test1.out
> ls test?.intest1.in test2.in test3.in
> ls test?.intest1.in test2.in test3.in
> ls test[1,3].intest1.in test3.in
> ls test[1,3].intest1.in test3.in
> ls test[1-3].intest1.in test2.in test3.in
> ls test[1-3].intest1.in test2.in test3.in
> echo W{hat,e,ant}What We Want
> echo W{hat,e,ant}What We Want
משתנים
(C)כמו בשפת משתניםמשתנים ניתן הגדיר CShellב-• על משתני אין צורך להכריזאין צורך להכריז, Cלהבדיל משפת •
CShellפעם פעם להם ערכים מציביםמציביםברגע ש מוגדריםמוגדריםהמשתנים –
ראשונהראשונה
set <variable> = <value>set <variable> = <value> לתוך משתנה <value> מציבה ערך setהפקודה •
<variable> אחריאחריובין אם לא, קיים קודם קיים קודם בין אם המשתנה היה –
שהוצב לתוכוקיים ומכיל את הערך קיים ומכיל את הערך ההצבה הוא 4242
משתנים
לקרואלקרוא, כדי Cלהבדיל משפת •ערך של משתנה לא מספיק
להוסיף להוסיף לציין את שמו - חייבים לפני השם של משתנה $$
משתנה בצורה לבטלניתן •unsetunsetמפורשת על ידי הפקודה
לא משתמשים בזה לעיתים –תכופות
4343
> echo $AA: Undefined variable.> echo $AA: Undefined variable.
> set A = 17> echo $A17
> set A = 17> echo $A17
>echo AA>echo AA
> set A = 777> echo $A777
> set A = 777> echo $A777
> unset A> echo $AA: Undefined variable.
> unset A> echo $AA: Undefined variable.
ערכים של משתנים
, שבה יש כמה Cלהבדיל משפת • CShellטיפוסים של משתנים, ב-
טיפוס אחדטיפוס אחדיש רק
יכול להכילCShellכל משתנה ב-•מספר שלםמספר שלם–מחרוזתמחרוזת–רשימהרשימה–
4444
> set A = 17> echo $A17
> set A = 17> echo $A17
> set A = Matam> echo $AMatam
> set A = Matam> echo $AMatam
פעולות על משתנים מספריים
ניתן להשתמש במשתנים CShellב - •ולבצע מספרים שלמים מספרים שלמים המכילים
פשוטות: פעולות חשבון פעולות חשבון עליהם --,++,%,/,*,-,+
לשים לשים כדי לבצע פעולת חשבון חייבים •בתחילת השורהסימן @ סימן @
ברגע מוגדרמוגדר המשתנה @גם בשורות עם –פעם ראשונהפעם ראשונה בו ערך מציביםמציביםש
4545
> set i = 3> echo $i3
> set i = 3> echo $i3
> @ i = $i + 1> echo $i4
> @ i = $i + 1> echo $i4
> @ i ++> echo $i5
> @ i ++> echo $i5
> echo $vv: Undefined variable.
> echo $vv: Undefined variable.
> @ v = $i + 12> echo $v17
> @ v = $i + 12> echo $v17
פעולות על משתנים מספריים - רווחים
לשים רווח לשים רווח שימו לב: יששימו לב: יש•אחרי @אחרי @–לפני ואחרי כל מספר או לפני ואחרי כל מספר או לרוב, –
משתנהמשתנהלא חייבים לפני ואחרי =•לא חייבים לפני ++,--•
4646
> @i++@i++: Command not found.> @i++@i++: Command not found.
> @ j = 2+ $i@: Badly formed number.> @ j = 2+ $i@: Badly formed number.
> @ j = 2 +$i@: Variable name must begin with a letter.
> @ j = 2 +$i@: Variable name must begin with a letter.
> @ j = $i +2@: Variable name must begin with a letter.
> @ j = $i +2@: Variable name must begin with a letter.
> @ j = $i+ 2@: Badly formed number.> @ j = $i+ 2@: Badly formed number.
פעולות על משתנים מספריים
היא גם פעולת השמת מספר השמת מספר •חשבון - ניתן לבצע אותה עם
@סימן פעולת חשבון פעולת חשבון אם מפעילים •
- מקבלים שגיאה מחרוזתמחרוזתעל בפרט עם משתמשים ב-@ –
להצבת מחרוזת
4747
> @ i = 3> echo $i3
> @ i = 3> echo $i3
> set i = Matam> @ i++@: Expression Syntax.
> set i = Matam> @ i++@: Expression Syntax.> @ set i = Matam@: Expression Syntax.> @ set i = Matam@: Expression Syntax.
פעולות על משתנים מספריים
רק על רק על פעולות חשבון - •שלמיםשלמים
פעולת חשבון לא ניתן לשלב לא ניתן לשלב •עם פעולה אחרת, חוץ מאשר
while ו-ifבתנאי ב- ++, post ו-preאין משמעות ל-–
Cכמו ב-
4848
> set i = 7> @ echo ($i + 2)@: Unknown operator.
> set i = 7> @ echo ($i + 2)@: Unknown operator.
> echo ($i + 2)(7+2)> echo ($i + 2)(7+2)
> set i = 1.7> @ i++@: Badly formed number.
> set i = 1.7> @ i++@: Badly formed number.
> @ j = $i++@: Badly formed number.> @ j = $i++@: Badly formed number.
> @ ++i@: Variable name must begin with a letter.
> @ ++i@: Variable name must begin with a letter.
> if ($i + 2 > 8) echo yesyes> if ($i + 2 > 8) echo yesyes
פעולות על משתנים מספריים - סוגריים
בסוגרייםבסוגרייםניתן להשתמש •בפעולות חשבון
האסוציאטיביות האסוציאטיביות שימו לב:•אינה סטנדרטיתאינה סטנדרטית
4949
> @ i = 2 - 3 + 4> echo $i-5
> @ i = 2 - 3 + 4> echo $i-5
> @ i = (2 - 3) + 4> echo $i3
> @ i = (2 - 3) + 4> echo $i3
מחרוזות
, כל רצף של CShellב - •תווים נקרא מחרוזת,
אולם אם רוצים לעבוד עם מחרוזות המכילות
יותר ממילה אחת יותר ממילה אחת ( יש רווחיםרווחים)מכילות
גרשייםגרשייםלתחום אותן בין ""
5050
> set A = abc def ghi> echo $Aabc
> set A = abc def ghi> echo $Aabc> set A = "abc def ghi"> echo $Aabc def ghi
> set A = "abc def ghi"> echo $Aabc def ghi
רשימות
, רשימהרשימה המכיל aעבור משתנה • i מציין את האיבר ה-a[i]a[i]הביטוי
ברשימהCבדומה למערך ב-–
האיברים מספורמספור -cshellב•--11מתחיל ממתחיל מ aברשימה
C, להבדיל מהמערכים ב-0ולא מ-–•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.
> 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.
5151
>set v[3] = (1 2 3)set: syntax error >set v[3] = (1 2 3)set: syntax error
פעולות על רשימות
מציין את מספר האיברים ברשימה{a$}#הביטוי • עבור המשתנים שהן לא רשומות1ערכו –
שלה על תת-רשימהתת-רשימה, ניתן לציין aבהינתן רשימה •ידי הביטויים הבאים:
a[m-n] n עד לאיבר ה-mמהאיבר ה-
a[-n] nמהאיבר הראשון עד לאיבר ה-
a[m-] עד לאיבר האחרוןmמהאיבר ה-
5252
> set a = ( aa bb cc dd ee )> echo $#a5>echo $a[3-]cc dd ee>echo $a[2-4]bb cc dd> echo $a[-3]aa bb cc
> set a = ( aa bb cc dd ee )> echo $#a5>echo $a[3-]cc dd ee>echo $a[2-4]bb cc dd> echo $a[-3]aa bb cc
shiftפעולות על רשימות -
shift <list>shift <list>מקום אחד list >את כל איברי הרשימה > מזיזהמזיזה•
ומבטלת את האיבר הראשון.שמאלהשמאלה
> set v = ( go to the beach )> echo $v[1] go > shift v> echo $v[1]to> echo $vto the beach
> set v = ( go to the beach )> echo $v[1] go > shift v> echo $v[1]to> echo $vto the beach
5353
משתנים: נקודות נוספות
כל משתנהכל משתנהניתן להתייחס ל•רשימה בת רשימה בת כאל Cshellב-
איבר אחדאיבר אחד
מחרוזתמחרוזת בין הבדלהבדלשימו לב ל•רשימהרשימהל
5454
> set A = 17 > echo $A 17> echo $A[1]17>echo $#A1
> set A = 17 > echo $A 17> echo $A[1]17>echo $#A1
> set A = " aa bb cc”> echo $A aa bb cc>echo $#A1> 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 $#A1> 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 $#A3> echo $A[1]aa> echo $A[2]bb
> set A = (aa bb cc)> echo $A aa bb cc>echo $#A3> echo $A[1]aa> echo $A[2]bb
משתנים: נקודות נוספות
לרשימת לפרק מחרוזת לפרק מחרוזת ניתן •המילים המופיעות בה ע"י
השמת המחרוזת בתוך סוגריים.
בסוגריים בסוגריים ניתן להשתמש •מהו להדגישלהדגיש בכדי מסולסליםמסולסלים
של משתנה. שמושמולהצמיד להצמיד נחוץ כשאר רוצים –
לערך של משתנה מחרוזת מחרוזת
5555
> set A = " aa bb cc”> echo $A[1]aa bb cc>set A = ($A)> echo $A[1]aa
> set A = " aa bb cc”> echo $A[1]aa bb cc>set A = ($A)> echo $A[1]aa
> set A = xxx> echo ${A}yyyxxxyyy> echo $AyyyAyyy: Undefined variable.
> set A = xxx> echo ${A}yyyxxxyyy> echo $AyyyAyyy: Undefined variable.
מנגנון ההיסטוריה
שבוצעו.לחזור על הפקודות לחזור על הפקודות מנגנון המאפשר •הפקודה האחרונההפקודה האחרונהאת מציין מציין - !!!!••!!gccgcc - ב- הפקודה האחרונה המתחילההפקודה האחרונה המתחילהאת מציין מציין gcc•historyhistory -שבוצעו. ניתן לקבוע רשימת הפקודות רשימת הפקודות את מדפיסמדפיס
"זוכר אחורה" על ידי shellאת מספר הפקודות אותן ה-historyקביעת ערכו של המשתנה
•<!<!nn>> - את הפקודה שמספרה מציין מצייןnברשימה מקשי מקשי מאפשר לבצע פקודות שבוצעו בעזרת shellבנוסף ה-•
)למעלה/למטה(החיצים החיצים
>set history=100100ל-מספר הפקודות הנזכרות מספר הפקודות הנזכרות הפקודה קובעת את •
5656
Command substitution
לשתול פקודה בתוך מחרוזת או לשתול פקודה בתוך מחרוזת או ניתן cshellב-•פקודה אחרתפקודה אחרת
`מקיפים את הפקודה הנשתלת בגרשיים הפוכים •backticksbackticksאו backquotesbackquotesהמכונים באנגלית–
•cshell אותה מחליףמחליףאת הפקודה הנשתלת ו מבצעמבצעביחד עם הגרשיים ההפוכים במה שהיא הדפיסה
> set A = “there are `ls | wc -l` files in `pwd` “> echo $Athere are 662 files in /usr/bin
> set A = “there are `ls | wc -l` files in `pwd` “> echo $Athere are 662 files in /usr/bin
5757
Command substitutionדוגמא
שמכיל רשימת קבצים farm_listבהינתן הקובץ •שמייצגים חוות
farm_listניתן לספור פרות בכל חווה שב-•בשורה אחת :
5858
farm1farm2farm1farm2
> grep -c cow `cat farms_list`farm1:3farm2:2
> grep -c cow `cat farms_list`farm1:3farm2:2
CShell אופן הפעולה של
•CShell עובד בלולאהעובד בלולאה :promptpromptהצגת –לפקודה המתנההמתנה– שלההביצועהביצוע בפקודה כולל טיפולטיפול–
מבני הנתונים מבני הנתונים מנהל את CShellלצורך עבודתו •הבאים:
רשימת ההיסטוריה–רשימת המשתנים –aliasesרשימת ה-–
5959
CShellטיפול בפקודה :
: הפקודה מופרדת למילים. ניתוח הפקודהניתוח הפקודה1.1.משמשים כמפרידים בין מיליםTabהתווים רווח ו-
,|, <,> מפרידים בין פקודותnewlineהתווים
: ביצוע החלפות לקבלת פקודה עיבוד הפקודהעיבוד הפקודה2.2.פשוטה. מבוצעות החלפות היסטוריה, תבניות של
, משתנים וכד'aliasesשמות הקבצים,
: ביצוע הפקודה הפשוטה ביצוע הפקודהביצוע הפקודה3.3.שהתקבלה אחרי העיבוד
6060
עיבוד הפקודה
במידה והפקודה מכילה שימוש בפקודות קודמות )ע"י השמוש 1.. History Substitutionבסימן !( מתבצע
- שורת הפקודה שהתקבלה נשמרת ברשימת ההיסטוריה של הפקודות שבוצעו
alias מתבצע aliasאם המילה הראשונה בפקודה הנה שם של 2.substituion .
.variable substitutionביצוע 3.
.File name substitutionביצוע 4..5command substitution ה .back-quoted string) ... ( ` מוחלפת `
בתוצאת הפקודה
מבצעCShellבנוסף, .1I/O redirectionpipelineטיפול ב-2.
6161
History Substitution
כאשר מתבצעת החלפת ההיסטוריה, שורת •הפקודה )לאחר ההחלפה( מודפסת למסך
6262
>ls farm*farm1 farm2 farms_list> !!ls farm*farm1 farm2 farms_list
>ls farm*farm1 farm2 farms_list> !!ls farm*farm1 farm2 farms_list
> echo AAAAAA> set last_command = "the last command was !!"set last_command = "the last command was echo AAA"> echo $last_commandthe last command was echo AAA
> echo AAAAAA> set last_command = "the last command was !!"set last_command = "the last command was echo AAA"> echo $last_commandthe last command was echo AAA
ביצוע הפקודה: סוגי הפקודה
•Cshell.מבצע את הפקודה בהתאם לסוג שלה ישנם שני סוגים של פקודות:CShellמבחינת • עצמו. פקודות אלה מבצעות CShell של (build-in) פקודות פנימיותפקודות פנימיות•
את משימות הבאות:(history)ניהול ההסטוריה ניהול ההסטוריה –( set/unset/shift) המשתניםהמשתניםרשימת ניהולניהול–aliasesaliases (alias/unalias) רשימת ה-ניהולניהול–(cd)התיקייה הנוכחית התיקייה הנוכחית שינוי –בקרת זרימה בתסריטים )בתרגול הבא(–ניהול תהליכים )בתרגול הבא(–
- כל פקודה שהיא לא פנימית. אלה יכולות להיותפקודות חיצוניות פקודות חיצוניות •תוכניות של משתמש–cat,ls,grepתוכניות שרות סטנדרטיות, כמו –
6363
ביצוע הפקודה: סוגי הפקודה
מבצע בעצמוCShellהפקודות הפנימיות הפקודות הפנימיות את • שולח למערכת CShellהפקודות החיצוניות הפקודות החיצוניות את •
ההפעלה לביצוע, יחד עם הארגומנטים שלהן•CShell שם שם חייב לשלוח למערכת ההפעלה את
:(full path name)המלא המלא כולל המסלול הפקודההפקודהשל הפקודה, השם המלא השם המלא אם המשתמש ציין את –
CShell כמו שהוא כמו שהוא אותו שולחשולחאם המשתמש ציין רק את השם של הפקודה )בלי –
בכל התיקיות יחפש את הפקודה יחפש את הפקודה CShellהמסלול(, pathpathהמופיעות ברשימה של המשתנה
6464
חיפוש הפקודה
כלשהיא על ידי למצוא פקודה למצוא פקודה CShellניתן לבקש מ-•wherewhereהפקודה
כך ניתן לדעת לפני ביצוע הפקודה–במערכת הקבצים קיימתקיימתהאם פקודה כלשהיא •אותהמצליח למצוא מצליח למצוא CShellהאם•נמצאתנמצאתהיא איפהאיפה•
ניתן להוסיף תיקיות לרשימת התיקיות לחיפוש •פקודות
mybin~/למשל הפקודה הבאה תוסיף את התיקיה –
> set path = ($path ~/mybin)
6565
> where cat/bin/cat> where cdcd is a shell built-in> where wherewhere is a shell built-in
> where cat/bin/cat> where cdcd is a shell built-in> where wherewhere is a shell built-in
סוגי גרשיים
(back quote)גרש הפוך גרש הפוך - ` ` command substitutionמשמש לצורך
(double quote)גרשיים כפולים גרשיים כפולים - "(single quote)גרש יחיד גרש יחיד - ' '
להתייחס למספר מילים )מופרדות ברווחים CShellמשמשים כדי לגרום ל-–וטאבים( כאל מילה אחת
גרשיים כפוליםגרשיים כפולים רק בתוךרק בתוךמתבצעת החלפת משתנים החלפת משתנים –
–command substitutioncommand substitution רק בתוך גרשיים כפוליםרק בתוך גרשיים כפוליםמתבצע`
6666
> 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
> 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 `> echo '`ls` '> `ls `
File name expansion גרשיים:
•File name expansion בתוך לא מתבצע לא מתבצעגרשיים בודדים או כפולים:
6767
> echo farm*farm1 farm2 farms_list> echo “farm* ”farm*> echo ' farm* 'farm*
> echo farm*farm1 farm2 farms_list> echo “farm* ”farm*> echo ' farm* 'farm*
Command Substitution: נקודותנוספות
•CShell ממה בונה רשימה בונה רשימה backticksשהפקודה בתוך ה-
מדפיסה.הרשימה נבנת בצורה הבאה:•
בתוך בתוך לאלא backticksאם ה-1.טאב טאב , רווחרווח, כל גרשיים כפוליםגרשיים כפולים
מפריד בין מעבר שורה מעבר שורה סימןסימןאו האיברים ברשימה
בתוך גרשיים בתוך גרשיים backticksאם ה-2.רק סימן מעבר שורה רק סימן מעבר שורה , כפוליםכפוליםבין האיברים ברשימהמפריד מפריד
6868
> cat linesa bc d> set A = `cat lines`> echo $#A4> echo $A[1]a> echo $A[2]b> set A = "`cat lines`"> echo $#A2> echo $A[1]a b> echo $A[2]c d
> cat linesa bc d> set A = `cat lines`> echo $#A4> echo $A[1]a> echo $A[2]b> set A = "`cat lines`"> echo $#A2> echo $A[1]a b> echo $A[2]c d