50
כתיבת תסריטים ב- bash בקרת תהליכים ב- UNIX שאלות ממבחנים

bash - UNIXwebcourse.cs.technion.ac.il/234122/Spring2014/ho/WCFiles/tutorial2.pdf · ˘script - ) Bash ˚ # # source ˚ Shell- ˘ ˚ 4 234122 - ˘ echo Running test 1

Embed Size (px)

Citation preview

bash-תסריטים בכתיבת �

UNIX-תהליכים בבקרת �

ממבחניםשאלות �

הרצת תסריטים�

bash-מבני בקרה ב�

דוגמאות�

bash-ו Cהשוואה בין �

2 234122 -מבוא לתכנות מערכות

שברשותנו קבצי בדיקה ופלט לתכנית שלנו ) מקרה היפותטי לחלוטין(נניח � וברצוננו לבדוק את נכונות התכנית מול קבצים אלו

פקודות לכל בדיקה 3צריך לכתוב �

גם עם שימוש במנגנון ההיסטוריה הרצת הבדיקות� מעיקה ולוקחת הרבה זמן מיותר

" תסריט"ניצור קובץ אשר יכיל . של הרצת הפקודות אוטומטיזציה:הפתרון�לפיו יורצו כל הפקודות לפי הסדר

3 234122 -מבוא לתכנות מערכות

> mtm_rentals < test1.in > tmpout 2> tmperr> diff expout1 tmpout> diff experr1 tmperr

על ידי הפקודה ) script -תסריט להלן ( Bashניתן להריץ קובץ המכיל פקודות �

source

כאילו נכתבו בשורת הפקודה אחת אחרי הנוכחי Shell-הפקודות יבוצעו ב�

השניה

4 234122 -מבוא לתכנות מערכות

echo Running test 1mtm_rentals < test1.in > tmpout 2> tmperrdiff expout1 tmpoutdiff experr1 tmperr echo Running test 2mtm_rentals < test2.in > tmpout 2> tmperrdiff expout2 tmpoutdiff experr2 tmperr echo Running test 3mtm_rentals < test3.in > tmpout 2> tmperrdiff expout3 tmpoutdiff experr3 tmperr

run_tests

> source run_testsRunning test 1Running test 2Running test 3

אשר בתיקית הבית login.בהתחברות של משתמש למערכת מורץ התסריט �

של המשתמש

bashrc.מורץ התסריט Bashחדש של Shellבפתיחת �

ולכן הן משפיעות על , sourceהרצות תסריטי האתחול מתבצעות באמצעות �

Shell-מצב ה

5 234122 -מבוא לתכנות מערכות

PATH=$PATH:.alias ll="ls -l"alias cdex2="cd ~mtm/public/1011a/ex2"alias GCC="gcc -std=c99 -Wall \

-pedantic-errors -Werror"

.bashrc

# welcome messageecho ------ Welcome `whoami` !--------echo You are in `pwd` directory of \`hostname`echo OS is `uname -s`# echo disk usage is `du -sh | cut -f1`echo `who | wc -l` users are logged inecho Today is `date`

.login

:ניתן להריץ תסריט כפקודה�

התסריט יש להוסיף את השורה בתחילת–

#!/bin/bash

שהשורה הראשונה בקובץ מגדירה את התכנית לביצוע שאר Unix-מסמן ל !#•

הפקודות בקובץ

•/bin/bash במקרה שלנו , הוא שם התכנית לביצוע הפקודותBash

בנוסף יש להוסיף הרשאת ריצה לקובץ–

כעת ניתן להריץ את התסריט כמו תכנית רגילה–

חדש Shellתהליך התסריט יבוצע ב sourceבניגוד להרצה באמצעות פקודת �

אשר יסתיים בסוף ריצת התסריט

6 234122 -מבוא לתכנות מערכות

:נמיר את תסריט הרצת הבדיקות שלנו לקובץ הרצה�

מתחילהתסריט: בעיה חדשה�

הוספת בדיקות נוספות, להסתבך

)ייתכנו אלפי בדיקות(משכפלת קוד בתסריט ולא נוחה

Cבדומה לשפת ) תנאים ולולאות(נשתמש במבני בקרה : פתרון�

7 234122 -מבוא לתכנות מערכות

#!/bin/bashecho Running test 1mtm_rentals < test1.in > tmpout 2> tmperrdiff expout1 tmpoutdiff experr1 tmperr echo Running test 2mtm_rentals < test2.in > tmpout 2> tmperrdiff expout2 tmpoutdiff experr2 tmperr echo Running test 3mtm_rentals < test3.in > tmpout 2> tmperrdiff expout3 tmpoutdiff experr3 tmperr

run_tests

> chmod a+x run_tests> ./run_testsRunning test 1Running test 2Running test 3

�Bash למשל (במבני בקרה מאפשרת שימושwhile ו-if ( בתסריטים ובשורת

הפקודה

Cבדומה למבני הבקרה שבשפת בתנאיםמבני הבקרה משתמשים �

השוואת ערכי מספרים–

השוואת מחרוזות–

...ועוד–

נעבור על מספר מבני בקרה�

ותנאים שימושיים

8 234122 -מבוא לתכנות מערכות

> for ((i = 1; $i < 10; i++ )); do> if (($i % 3 == 0)); then> echo 3 divides $i> fi> done3 divides 33 divides 63 divides 9

:bash-ב whileניתן ליצור לולאות �while <expression>; do

<command1><command2>...

done

ממשיך להתקיים <expression>הפקודות בגוף הלולאה יבוצעו כל עוד –

מהטרמינל ישירותכמו שאר מבני הבקרה ניתנות לביצוע whileלולאות –

9 234122 -מבוא לתכנות מערכות

#!/bin/bashi=1while (( i <= 3)); do

echo Running test $imtm_rentals < test${i}.in \

> tmpout 2> tmperrdiff expout${i} tmpoutdiff experr${i} tmperrlet i++

done

run_tests

> ./run_testsRunning test 1Running test 2Running test 3

> i=1> while (( i <= 3)); do> echo $i> let i++> done123

:הוא מעבר על על איברי המערך for-שימוש נוסף ב�for <varname> in <array> ; do

<command1>

<command2>...

done

�<varname> הוא שם המשתנה שיכיל בכל פעם איבר מהרשימה

�<array> היא רשימה של מחרוזות

העדיפו להשתמש בשיטה זו על פני שימוש מפורש באינדקסים�

10 234122 -מבוא לתכנות מערכות

למעבר נוח יותר על תחום מספרים Cמשמשת בדומה לשפת forלולאת �

11 234122 -מבוא לתכנות מערכות

#!/bin/bashfor ((i = 1; i <= 3; i++)); doecho Running test$i

mtm_rentals < test${i}.in > tmpout 2> tmperrdiff expout$i tmpoutdiff experr$i tmperr

done

run_tests

> ./run_testsRunning test1.inRunning test2.inRunning test3.in

משפטי תנאי בשתי גרסאות bash-ניתן להגדיר ב�

if <expression>; then

<command1>

<command2>

...

fi

ופקודות אשר יתבצעו אם התנאי אינו מתקיים elseניתן להוסיף �

if <expression>; then

<commands>

else

<commands>

fi

12 234122 -מבוא לתכנות מערכות

> i=1> if (( $i > 0 )); then> echo POSITIVE> else> echo NEGATIVE > fiPOSITIVE

קיימות מספר אפשרויות לכתיבת התנאים בלולאות ומשפטי תנאי�

[[ ]]:ניתן לרשום תנאים בתוך �

)לפי סדר לקסיקוגרפי(משווים מחרוזות < -ו> האופרטורים –

לתבניתמאפשר התאמת מחרוזת == האופרטור •

eq ,-gt ,-le-ניתן לבצע השוואת על ערכי מספרים בעזרת דגלים כגון –

bash-חשוב להקפיד על תו הרווח בין הסוגריים לתוכן התנאי כדי למנוע שגיאות ב–

13 234122 -מבוא לתכנות מערכות

> str1=Hello> if [[ $str1 == Hello ]]; then echo true; fitrue> if [[ hello == Hello ]]; then echo true; fi> if [[ 11 < 7 ]]; then echo true; fitrue> if [[ 11 -le 7 ]]; then echo true; fi

> if [[ 11 -eq 11 ]]; then echo true; fitrue> if [[ 0 -eq Hello ]]; then echo true; fitrue

זו אינה השוואת ערכים מספריים

עבור ערך שאינו מייצג מספר לחישוב 0-משתמשים ב

מאפשר התאמת מחרוזת לתבנית ==האופרטור , [[ ]]בתוך תנאי מהצורה �

הארגומנט השמאלי הוא מחרוזת רגילה–

כמו שתואר [ ] -ו ?, *אשר יכולה לכלול את הסימנים תבנית הארגומנט הימני הוא –

עבור תבניות של שמות קבצים

על מנת לבטל את המשמעות המיוחדת של "" ניתן להשתמש בגרשיים כפולים •

התווים הללו

==הוא השלילה של אופרטור ההתאמה =! האופרטור �

זהה== -ו= המשמעות של –

14 234122 -מבוא לתכנות מערכות

> end_with_z="some string with z"> if [[ "$end_with_z" = *[zZ] ]]; then echo match; fimatch> if [[ "this string start with t" = t* ]]; then echo true; fitrue> if [[ "this string doesn't start with t" = [^t]* ]]; then echo true; fi> file=test4.in> if [[ $file = test*.in ]]; then echo test file; fitest file> if [[ "string doesn't start with t" != t* ]]; then echo true; fitrue

:למשל, ניתן להשתמש בתנאים מועילים נוספים[[ ]] בתוך � <filename>בודק האם קיים קובץ בשם <f <filename-התנאי –

<dirname>ה בשם יבודק האם קיימת תיקי <d <dirname-התנאי –

:ניתן לבדוק תנאים מורכבים יותר� Cכמו בשפת ! -ו&&, ||, ניתן להשתמש באופרטורים –

כדי להימנע משגיאות בגלל מנגנון ההיסטוריה! הקפידו להשאיר רווח אחרי •

ניתן להשתמש בסוגריים כדי לקבוע את הקדימויות–

15 234122 -מבוא לתכנות מערכות

> if [[ -f a.txt ]]; then echo file exists; fi> cat > a.txtHello world!> if [[ -f a.txt ]]; then echo file exists; fifile exists> mkdir mtm> if [[ ! (-f b.txt && -d mtm) ]]; then echo yes; fiyes

))((ניתן להגדיר תנאי בתוך �

מתייחסים לערכים מספריים< -ו, > =!, ==האופרטורים )) ((בתוך –

לפני שם משתנה$ אין צורך לרשום –

ניתן לבצע פעולות חשבוניות–

$))((מתנהגים כמו ביצוע פעולות חשבוניות בעזרת ))((תנאים המוגדרים בעזרת �

16 234122 -מבוא לתכנות מערכות

> if (( 11 < 7 )); then echo true; fi> i=5> if (( i >= 0 && i <= 10 )); then echo true; fitrue> if [[ 11 -eq 11 ]]; then echo true; fitrue> if (( 0 == Hello )); then echo true; fitrue> if (( ++i == 6 )); then echo true; fitrue> if (( ++i == 6 )); then echo true; fi

ניתן לגשת לפרמטרים המועברים בשורת הפקודה לתסריט C-כמו ב�

n$וניתן לקרוא אותו על ידי , nלתסריט נקרא פשוט n-הפרמטר ה�

יוחלף ברשימת כל הארגומנטים לתסריט *$�

כדי לשמור על מספר "@$"-אם ייתכנו רווחים בתוך הארגומנטים ניתן להשתמש ב–

האגומנטים הנכון

יוחלף בשם התסריט �$0

יוחלף במספר הארגומנטים #$�

17 234122 -מבוא לתכנות מערכות

> echo_script aaa bbb ccccommand: echo_script3 argumentsparameter 1 : aaaparameter 2 : bbbparameter 3 : ccc

#!/bin/bashecho command: $0echo $# arguments let number=1for param in $*; do

echo parameter $((number++)) : $paramdone

echo_script

:פונקציות בצורה כזו bash-ניתן להגדיר ב�

function <name> {

<commands>

}

פונקציה חייבת להכיל לפחות פקודה אחת–

השימוש בפונקציה יכול להתבצע רק אחרי הגדרתה–

ארגומנטיםלהעביר לפונקציה אפשר –

הפונקציה משתמשת בהם בדומה לשימוש•

בארגומנטים המועברים לתסריט

הפונקציה אינה יכולה לגשת לארגומנטים•

של התסריט שקרא לה

18 234122 -מבוא לתכנות מערכות

:localכדי ליצור משתנה מקומי בפונקציה יש להכריז עליו תחילה עם �

19 234122 -מבוא לתכנות מערכות

> using_localoriginal_a original_boriginal_a surprise_b

#!/bin/bashfunction surprise {

local a=surprise_ab=surprise_b

}a=original_ab=original_becho $a $bsurpriseecho $a $b

using_local

):command subsitution )backticksערכים מפונקציה בעזרת " להחזיר"ניתן �

20 234122 -מבוא לתכנות מערכות

> sum_numbers 1 2 3 4 515

#!/bin/bashfunction sum {

local result=0 for num in $*; do

let result+=$numdoneecho $result

}n=`sum $*`echo $n

sum_numbers

ביטוי זה יוחלף בסכום הרצוי

<read <flags> <variable nameניתן לקרוא שורה מהקלט הסטנדרטי על ידי �

השורה תיקלט לתוך שם המשתנה שהוגדר–

יחלק את השורה לפי מילים לתוך מערך a-הדגל –

בשורת קלט שתיקלט מהקלט הסטנדרטי bashעל ידי יוחלף readהביטוי �

21 234122 -מבוא לתכנות מערכות

> read lineHello world> echo $lineHello world> read -a lineHello world> echo $lineHello> echo ${line[*]}Hello world

:read-דרך פשוטה לקריאת קובץ היא על ידי שימוש בהפניית קלט ושימוש ב�

:דרך פשוטה לקרוא קובץ שורה אחר שורה היא כך�

22 234122 -מבוא לתכנות מערכות

#!/bin/bashcounter=0while read line; do

echo $linelet counter++

done < "$1"echo $counter

lines_counter

> cat hello.txtHello world!> read line < hello.txt> echo $lineHello world!

> cat lines.txtfirst linesecond line> lines_counter lines.txt first linesecond line2

כתבו נכדי לערבב תסריטים עם תכניות ש bash-שימו לב שניתן להשתמש ב�

בקלותבשפות שונות

scripting languages -מכאן מגיע כוחן של שפות תסריטים –

ניתן להעביר פרמטרים לתסריטי עזר�

בעזרת פרמטרים בשרות הפקודה–

pipelineבעזרת –

בעזרת קבצים זמניים–

ניתן לקבל ערכים חזרה מתסריטי עזר�

בעזרת פלט מתסריט העזר–

23 234122 -מבוא לתכנות מערכות

העברת פרמטרים לתסריטי עזר �

יכולה להתבצע בדרכים הבאות

שורת הפקודהב–

helper_script $arg1 $arg2

pipelineבעזרת –

echo $arg1 $arg2 | helper_script

דרך קובץ זמני–

echo $arg1 $arg2 > temp

helper_script < temp

24 234122 -מבוא לתכנות מערכות

החזרת ערכים מתסריטי העזר יכולה �

להתבצע בעזרת

backticks-שימוש ב–

result=`helper_script`

pipeline-העברה לתסריט אחר ב–

helper_script | another_script

דרך קובץ זמני–

helper_script > temp

הנוכחי ולהחזיר ערך shell-על מנת לצאת מה exitניתן להשתמש בפקודה �

:יציאה נבחר

exit [status]

מספר (כל ערך אחר . של התוכנית" הצלחה"ומייצג –0ערך בררת המחדל הוא �

.אמור לייצג כישלון) שלם

?$בכל רגע נתון ערך היציאה האחרון שמור במשתנה �

25 234122 -מבוא לתכנות מערכות

> ./example_script

hi

> echo $?

1

> echo $?

0

#!/bin/bash

echo "hi"

exit 1

echo "bye"

example_script

אשר מקבל מחרוזת ושמות קבצים ומדפיס את כל searchכתבו תסריט בשם �

השורות המופיעות בקבצים הללו המכילות את המחרוזת המבוקשת

ייבדקו כל הקבצים תחת התיקיה הזו רקורסיבית, אם מתקבל שם תיקיה–

26 234122 -מבוא לתכנות מערכות

> search Blue scene35.txtscene35.txt : 37 : LAUNCELOT: Blue.scene35.txt : 55 : GALAHAD: Blue. No yel-- Auuuuuuuugh!> search swallow scene*.txtscene1.txt : 50 : GUARD #1: But then of course African swallows are not migratory.scene1.txt : 54 : GUARD #2: Wait a minute -- supposing two swallows carried it together?scene35.txt : 63 : BEDEMIR: How do know so much about swallows?> search cow farmsfarms/animals/animals.txt : 8 : cowfarms/farm1.txt : 2 : cow Betsyfarms/farm1.txt : 3 : slim cow Dazyfarms/farm1.txt : 4 : fat cow Burgerfarms/farm1.txt : 5 : two cows Dartsy & Teofarms/farm2.txt : 2 : cow Lenifarms/farm2.txt : 4 : cow Oreo

searchנכתוב תסריט בשם �

התסריט ישתמש בפונקצית עזר�

הקוראת קובץ ומוצאת את השורות

המתאימות בעזרת התאמת מחרוזות

27 234122 -מבוא לתכנות מערכות

#!/bin/bashfunction search_file {

n=1while read line; do

if [[ $line = *"$1"* ]]; thenecho “${2} : ${n} : $line”

filet n++;

done < "$2"}for file in ${*:2}; do

if [[ -f "$file" ]]; thensearch_file "$1" $file

fiif [[ -d "$file" ]]; then

search "$1" $file/*fi

done

search

המכיל football.txtנתון קובץ בשם �

נתונים על שערים שהובקעו במשחקי

כדורגל

, שורה בקובץ מציינת שם של שחקןכל �

במשחקמספר השערים שהבקיע

הקבוצהשם , בתאריך מסויםשנערך

היריבההוא שיחק ושם הקבוצה בה

אשר playerברצוננו לכתוב תסריט בשם �

יקבל כפרמטר שם של שחקן

וידפיס את כל השורות עבורו

ואת סכום football.txtמהקובץ

מספר השערים שהבקיע

28 234122 -מבוא לתכנות מערכות

Alon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-Aviv

Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer-Sheva

Ronen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-Aviv

Reuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-Aviv

Eyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv

Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Haifa

Alon Miz. 2 26/10/93 Macabi-Haifa Beitar-Jerusalem

Izak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-Hiafa

Alon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-Tikva

Ronen Ha. 3 27/11/93 Hapoel-Tel-Aviv Macabi-Haifa

football.txt

> player "Alon Miz."Alon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-TikvaTotal number of goals: 6

שכתבנו searchנשתמש בתסריט �

מקודם כדי לקבל רק את השורות

הרלוונטיות

calc_totalנכתוב פונקצית עזר בשם �

אשר תקרא את השורות מהקלט

הסטנדרטי שלה ותסכום את מספר

הגולים של השחקן תוך כדי הדפסתן

29 234122 -מבוא לתכנות מערכות

#!/bin/bashfunction calc_total {

sum=0while read -a line; do

let sum+=${line[6]}echo ${line[*]:4}

doneecho "total number of goals: $sum"

}

search "$1" football.txt | calc_total

player

אשר יקבל רשימה של שמות best_playerכתבו תסריט לדירוג שחקנים בשם �

שחקנים בשורת הפקודה וידפיס את שם השחקן שהבקיע את מרב הגולים

אם קיימים מספר שחקנים שהבקיעו את מרב הגולים יודפסו שמות כל השחקנים–

שהבקיעלכל שחקן יש להדפיס את שמו ומספר הגולים –

30 234122 -מבוא לתכנות מערכות

> best_player "Alon Miz." "Izak Zoh." "Ronen Ha." "Reuven A."Alon Miz. 6Ronen Ha. 6

31 234122 -מבוא לתכנות מערכות

max_goals=0for player in "$@"; do

goals=`sum_player_goals "$player"`if (( goals > max_goals )); then

max_goals=$goalsfi

donefor player in "$@"; do

goals=`sum_player_goals "$player"`if (( goals >= max_goals )); then

echo "$player" $max_goalsfi

done

#!/bin/bash# Sums the goals from lines in# the correct formatfunction sum_goals {

local sum=0while read -a line; do

let sum+=${line[6]}doneecho $sum

}

# Sums all the goals of target playerfunction sum_player_goals {

./search "$1" football.txt | sum_goals}

best_player

�Bash שפת תסריטים היא- scripting language

.Perl ,Tcl ,Python ,Ruby: שפות תסריטים נוספות–

�C שפת תכנות מערכת היא- system programming language

.#C++ ,Java ,C: שפות מערכת נוספות–

32 234122 -מבוא לתכנות מערכות

:Cעל bashשל יתרונות�

מחרוזות ומשתניםעבודה נוחה עם –

)7עוד על כך בתרגול (תכניות קיימות " להדביק"נוח –

משמעותית לחלק מהמשימות קצרקוד –

על דבריםלא צריך להכריז -אין קומפיילר –

:Cלעומת bashשל חסרונות�

אין בדיקות -אין קומפיילר –

מאפשר באגים מסוכנים

)לעתים פי כמה מאות( איטית–

מטלות פשוטות וקצרות שזמן הביצוע שלהן לא קריטיעבור bash-נבחר ב�

33 234122 -מבוא לתכנות מערכות

read deposits account_balance=100for d in ${deposits[*]}; do

acount_balance=$((account_balance + d))doneecho $account_balance

כדי לחסוך ביצוע חוזר וידני של פעולות ניתן ליצור תסריטים המכילים רצף � או הפיכתם לקובץ הרצה sourceפקודות שימושי ולהריצם בעזרת

המאפשרים כתיבת קוד מתקדם ifו while ,forקיימים מבני הבקרה bash-ב� בתסריטים

C-ניתן לגשת לפרמטרים לשרות הפקודה של תסריט בדומה לתכנית ב�

readנשתמש בפקודה bash-כדי לקרוא מהקלט הסטנדרטי ב�

י קריאת טקסט "ניתן לחלק תסריטים לפונקציות ולהעביר מידע ביניהן ע�בפונקציה וכתיבתו לפלט

כדי command substitution-ו pipelineנוח להדביק תסריטים ביחד בעזרת � לפתור בקלות בעיות

עבור , עבור מטלות פשוטות שאינן דורשות חישובים רבים bash-נשתמש ב� C-שאר המטלות נמשיך להשתמש ב

34 234122 -מבוא לתכנות מערכות

הרצה בחזית וברקע�

פקודות לניהול תהליכים�

35 234122 -מבוא לתכנות מערכות

�Unix היא מערכת הפעלה התומכת בריבוי תהליכים(multi-tasking)

חובה עבור מערכת שנועדה לשירות מספר רב של משתמשים בו זמנית–

תהליך הוא הרצה של תכנית כלשהי�

ניתן להריץ תכנית יחידה במספר תהליכים במקביל–

בניגוד למנשק גרפי בו השליטה במספר תהליכים אינטואיטיבית עבור עבודה �

בטרמינל יש להכיר מספר פקודות וקיצורים

36 234122 -מבוא לתכנות מערכות

�Shell יחיד יכול להריץ מספר תהליכים בו זמנית כל התהליכים מדפיסים את הפלט שלהם לערוצי הפלט הסטנדרטיים–

רק תהליך אחד יכול להשתמש בערוץ הקלט הסטנדרטי–

רץ בחזיתתהליך אשר מקושר לערוץ הקלט הסטנדרטי � כדי להריץ תהליך בחזית יש להפעילו כרגיל–

> command

ולא ניתן להכניס פקודות חדשות prompt-כל עוד תהליך רץ בחזית אין גישה ל–

רצים ברקעתהליכים שאינם מקושרים לקלט הסטנדרטי �

לסוף הפקודה &ניתן להריץ תהליך ברקע על ידי הוספת –

> command &

במצב זה התהליך אינו רץ אך מצבו נשמר בזיכרון , מושההתהליך יכול להיות גם �ונוכל להמשיך את הרצתו כשנרצה

37 234122 -מבוא לתכנות מערכות

Shell-מדפיסה את רשימת התהליכים המורצים תחת ה jobsהפקודה �

> jobs

מצבו ושם הפקודה, לכל תהליך מוצג מספר מזהה�

"הנוכחי"מייצג את התהליך +-סימן ה�

תהליך זה יהווה את ברירת המחדל לפקודות טיפול בתהליכים–

+מייצג את התהליך הבא בתור להיות --סימן ה�

38 234122 -מבוא לתכנות מערכות

#!/bin/bashwhile [[ true ]]; do

sleep 1echo Loop $1!

done

loop > ./loop 1 &[1] 3692> Loop 1!./loop 2 &[2] 3711Loop 2!Loop 1!

כאשר מספר תהליכים מוציאים פלט בו זמנית

הטרמינל מתבלגן במהירות

המספר בסוגריים המרובעים הוא מספר

Shell-התהליך תחת ה

כדי לשנות את מצב הריצה של התהליך הרץ בחזית ניתן לשלוח אותות בעזרת �

קיצורים מהמקלדת

�Ctrl+C : את התהליך אשר בחזית) מפסיק(הורג

�Ctrl+Z :משהה את התהליך אשר בחזית

התהליך מפסיק לרוץ אך מצבו נשמר–

39 234122 -מבוא לתכנות מערכות

fgניתן להחזיר תהליך לריצה בחזית בעזרת �

> fg [process]

bgניתן להחזיר תהליך לריצה ברקע בעזרת �

> bg [process]

suspendניתן להשהות תהליך על ידי �

> suspend <process>

killלהרוג תהליך על ידי הפקודה ניתן �

> kill <process>

�%י "ניתן לציין מספר תהליך ע–

<str>%י "ע <str>-ניתן להריץ את התהליך ששמו מתחיל ב–

אם קיימים שני תהליכים מתאימים הפקודה תיכשל•

+-לא צוין מספר תהליך יוחזר התהליך שמסומן באם : bg-ו fgעבור –

40 234122 -מבוא לתכנות מערכות

41 234122 -מבוא לתכנות מערכות

ריצה בחזית מושהה

ריצה ברקע מופסק

Ctrl+Z

fg

fg

kill

kill

Ctrl+C bg

suspend

הרצה רגילה

&הרצה עם

בתסריטים Unixשימוש בתכניות סטנדרטיות של �

42 234122 -מבוא לתכנות מערכות

מהתיקיה הנוכחית מעבירה קבצים אשר arrangeששמה bash-תכנית בכתוב �

:הכללים הבאיםתיקיות לפי -תתילתוך ) שאינם תיקיות(

:תיקיהלכל קובץ שאינו �

בשם האותיות הראשונות 4-ששמו זהה לתיקיה לתיקיה הנוכחית -אם קיימת תת1.

הקובץ ולא להעברתשים לב שהכוונה (. התיקיההקובץ יועבר לתוך , הקובץ

).להעתקתו

בתיקיה הנוכחית לפחות שני קבצים נוספים וקיימים , לא מתקיים 1אם תנאי 2.

האותיות הראשונות 4-האותיות הראשונות בשמם זהות ל 4-כך ש, שאינם תיקיות

האותיות 4-זהה לתיקיה חדשה ששמה -תתתיצור התוכנית , הקובץבשם

. תיקיה זו-תתיועבר לתוך והקובץ , הראשונות בשם הקובץ

43 234122 -מבוא לתכנות מערכות

file1 file2 file3 prog1 prog2 prog: הבאיםהנוכחי קיימים הקבצים במדריך � script1 script2 הינו תיקיה progרק הקובץ כאשר

file: בתיקיה זויהיו הקבצים הבאים , בתיקיה הנוכחית arrangeלאחר הפעלת התוכנית �script1 script2 prog כאשר:

–file ו–prog תיקיותהינם

הקבציםיהיו fileבתיקיה –file1 file2 file3

הקבציםיהיו progבתיקיה –prog1 ו- prog2 )בנוסף

לפנישהיו בתוכו לקבצים ). arrangeהתוכנית הפעלת

44 234122 -מבוא לתכנות מערכות

file1 file2 file3 script1 script2 prog prog1 prog2

file1 file2 file3 prog1 prog2

file script1 script2 prog

45 234122 -מבוא לתכנות מערכות

#!/bin/bashfunction files {for f in `ls`; doif [[ -f $f ]]; thenecho $f

fidone

}function fileCount {line=( `files | cut -c1-4 | sort | uniq -c | grep $1` )echo ${line[0]}

}

function makeDir {if [[ ! -d $1 ]] ; thenmkdir $1

fi}

arrange

46 234122 -מבוא לתכנות מערכות

for file in `ls` ;doif [[ ! -f $file ]] ; thencontinue

fidir="`echo $file | cut -c1-4`"dirsNum=`fileCount "$dir"`if (( dirsNum > 2 )) ; then

makeDir $dirfiif [[ -d $dir ]] ; then

mv $file $dirfi

done

arrange

ראיונות בפקולטההכריזה על יום , שהחליטה זה מכבר לפתוח סניף בחיפה, Moogleחברת � ).ם כמובן"אשר בהם יכולים להשתתף רק בוגרי קורס מת(למדעי המחשב בטכניון

.Moogleהראיונות נוכחים מספר מראיינים ובינהם גם מנהל במהלך �

.100-ל 0בין ציון למרואיין מראיין נותן כל –

.הציוניםכל שקלול י "הסופי יקבע עהציון –

.יתקבל לעבודה מרואיין שהמנהל החליט לא לקבליתכן כי יש זכות וטו ולא למנהל –

:הראיונות כל מראיין מכין קובץ בפורמט הבא על האנשים אותם הוא ראייןבסיום �

<ID> <FULL NAME> <GRADE>

.interviewer name>.grades>שם הקובץ הינו . בטאביםמזה מופרדים זה השדות –

:eyal.gradesדוגמה לקובץ בשם �

:ויכול להיראות כך Moogle.grades ייקרא Moogleהקובץ של מנהל �

47 234122 -מבוא לתכנות מערכות

031243129 Moshe Levi 60444422267 Shimon Cohen 90555782311 David David 100

031243129 Moshe Levi 57555782311 David David -NO-444422267 Shimon Cohen 80

את ויחזירינתח את הקבצים הללו אשר BestToWorkתסריט בשם עליכם לכתוב �מקומות ' כפרמטר את מסהתסריט יקבל . קבוצת המרואיינים הטובים ביותר

שכזה של מרואיינים מצטיינים ממויינים לפי מידת ' הפנויים ויחזיר מסהעבודה .ההצלחה

: ההודעהתוחזר , עברו את הראיון/ שאין מספיק מרואיינים שהתראיינו במקרה �"not enough interviewees”

:עבור שני הקבצים שבדוגמה, לדוגמה�

:הערות�

הניחו כי קבצי הקלט קיימים ותקינים–

ניתן להניח שאותם מראיינים ראיינו את כל האנשים–

אין להשתמש בקבצים זמניים–

תסריטיםניתן להשתמש במספר לא מוגבל של –

48 234122 -מבוא לתכנות מערכות

> BestToWork 21) 444422267 Shimon Cohen2) 031243129 Moshe Levi> BestToWork 3not enough interviewees

49 234122 -מבוא לתכנות מערכות

#!/bin/bashfunction PrintBest {

local num=1while read -a line; do

echo "${num}) ${line[0]} ${line[1]} ${line[2]}"let num++

done}function CalcOneGrade {

local total_grade=0while read -a line; do

let total_grade+=${line[3]}doneecho $total_grade

}

BestToWork

50 234122 -מבוא לתכנות מערכות

function CalcGrades {while read -a line; do

grade=`cat *.grades | grep ${line[0]} | CalcOneGrade`# $line[0] is ID, $line[1] is the first# name, $line[2] is the last nameecho ${line[0]} ${line[1]} ${line[2]} $grade

done}

if (( `cat Moogle.grades | grep -v "\-NO\-" | wc -l` < $1 )) ; thenecho "not enough interviewees"

elsecat Moogle.grades | grep -v "\-NO\-" | CalcGrades | \

sort -nrk3 | PrintBest | head -$1fi

BestToWork