חזור לתיקייה: תרגול

1 - מערכת ההפעלה UNIX

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה
  • מהי מערכת הפעלה?
  • מהי UNIX?
  • מהי ה-Shell?
  • מערכת הקבצים ב-UNIX
  • הרשאות של קבצים
  • הרצת קובץ
  • אוסף פקודות ב-UNIX
  • הפקודה ls
  • ניהול תיקיות
  • ניהול קבצים
  • הדפסת תוכן של קבצים
  • סיכום פקודות
  • הפניית קלט/פלט
  • ערוצי קלט-פלט
  • הפניית קלט/פלט
  • הרכבת פקודות

1 - מערכת ההפעלה UNIX

02340124

מבוא לתכנות מערכות

רשימות תרגול לקריאה בשבת

מערכת ההפעלה UNIX

הופק מתוך תקיית התואר של שקד

uni-folder.vercel.app

יהיו 6 תרגילי בית:
0. שימוש ביסי ב-ShellShellShell ובכלי פיתוח

  1. תכנות בסיסי בשפת C++C++C++
  2. מחלקות בשפת C++C++C++
  3. תכנות גנרי בשפת C++C++C++
  4. תכנון מערכת, תכנות מתקדם בשפת C++C++C++
  5. תכנות בסיסי בשפת PythonPythonPython.

מהי מערכת הפעלה?

מערכת הפעלה מהווה שכבת ביניים בין החומרה לבין התוכנה. היא מאפשרת גישה נוחה למחשב עבור משתמשים ומתכנתים.

  • עבור המשתמש: מספקת ממשק נוח למחשב ושירותים בסיסיים.
  • עבור המתכנת: מספקת ממשקים לניהול זיכרון, קבצים והתקני חומרה נוספים.
דוגמה

Windows,Ubuntu,Android,iOSWindows,Ubuntu,Android,iOSWindows,Ubuntu,Android,iOS

מהי UNIXUNIXUNIX?

זוהי משפחה של מערכות הפעלה שלהן יש סטנדרט נוח ואחיד עבור השירותים אותן מערכת ההפעלה מספקת(לסטנדרט הזה קוראים POSIXPOSIXPOSIX).
רוב מערכות ההפעלה המורכרות לכם עומדות בסטנדרט של UNIXUNIXUNIX:

  • המפורסמת ביותר כיום היא LinuxLinuxLinux, לה יש גרסאות רבות.
  • MacOSMacOSMacOS שגם היא מבוססת על UNIXUNIXUNIX
הערה

WindowsWindowsWindows היא לא מערכת הפעלה מבוססת UNIXUNIXUNIX.

מהי ה-ShellShellShell?

הקליפה(ShellShellShell) הוא כינוי לתוכנה המקשרת בין המשתמש לבין מערכת ההפעלה. כאשר בדרך כלל נוצר לשימוש דרך הטרמינל.
עבודת ה-ShellShellShell מתבצעת ע"י קבלת פקודה מהמשתמש, ביצוע החלפות טקסט בפקודה בהתאם לתכונות ה-ShellShellShell ולבסוף שליחת הפקודה המעובדת למערכת ההפעלה.

בקורס זה נלמד BashBashBash שזה סוג של קליפה.

רצף העבודה עם הקליפה:

  1. הקליפה תבקש או תאפשר לנו להכניס פקודה
  2. נכניס פקודה ונלחץ על אנטר
  3. הקליפה תעביר למערכת ההפעלה את הפקודה ותבצע אותה
  4. יודפס הפלט של הפקודה
  5. ובחזרה להתחלה.

מערכת הקבצים ב-UNIXUNIXUNIX

מערכת ההפעלה אחראית בין השאר על ארגון הקבצים במחשב. מערכת הקבצים ב-UNIXUNIXUNIX מורכבת מקבצים ותיקיות כאשר:

  • קובץ הוא אוסף סדור של תווים.
  • תיקיה מאפשרת שמירת מספר קבצים ותיקיות נוספות בצורה מסודרת.

לכל קובץ או תיקיה יש שם. אין מגבלות על מבנה השם אך מקובל ששם קובץ יכיל סיומת(extentionextentionextention) למשל test.ctest.ctest.c מסמל קובץ קוד מקור בשפת CCC.
אין ב-UNIXUNIXUNIX סיומת מיוחדת לקובץ הרצה וכל קובץ יכול להיות קובץ הרצה.

כל קובץ או תקייה נמצאים בתוך תקייה כלשהי למעט התקייה הראשית(rootrootroot)

שורש מערכת הקבצים נקרא "/" ונקרא לו rootrootroot.
כדי להתייחס לקובץ יש להשתמש בשמו:

  • ניתן להתייחס לקובץ ע"י שמו המוחלט: /usr/ari/progs/file.c/usr/ari/progs/file.c/usr/ari/progs/file.c
  • ניתן להתייחס לקובץ ע"י שם יחסי מהתקייה הנוכחית: אם התקייה נוכחית היא /usr/ari/usr/ari/usr/ari אזי נוכל להשתמש בשם progs/file.cprogs/file.cprogs/file.c.

מערכת ההפעלה UNIXUNIXUNIX היא מערכת הפעלה מרובת משתמשים. לכל משתמש קיימת תקיית בית ייחודית לו שנמצאת תחת התקייה /usr/usr/usr. בהתחברות למערכת התקייה הנוכחית היא תקיית הבית של המשתמש.

קיצורים חשובים:

  • נקודה - ... - מייצגת את התקייה הנוכחית.
  • שתי נקודות - ...... - מייצגות את תקיית האב(התקייה בה נמצאת התקייה נוכחית)
  • תילדה - ∼\sim∼ - מייצג את תקיית הבית של המשתמש כאשר ניתן לעשות user~ מייצגת קיצור לתקיית הבית של המשתמש useruseruser.

ניתן להשתמש בכוכבית - ∗*∗ - כדי להתייחס למספר קבצים בבת אחת על ידי שימוש בתבניות:

  • ∗*∗ מתייחס לכל הקבצים
  • ∗.txt*.txt∗.txt יותאם לכל הקבצים ששמם מסתיים ב-".txt.txt.txt"

הרשאות של קבצים

לכל קובץ יש הרשאות גישה הקובעות למי מותרת הגישה לקובץ ולצורך אילו פעולות.
ישנם 333 סוגי משתמשים:

  1. UserUserUser - בעל הקובץ. הוא המשתמש שיצר את הקובץ במערכת.
  2. GroupGroupGroup - משתמש אשר שייך לקבוצה של בעל הקובץ. הגדרת קבוצות משתמשים הינה מחוץ לחומר הקורס.
  3. OtherOtherOther - שאר המשתמשים במערכת.

לכל סוג משתמש יש 3 הרשאות שונות:

  1. ReadReadRead - מאפשרת קריאת תוכן הקובץ (כולל העתקתו)
  2. WriteWriteWrite - מאפשרת שינוי או מחיקת הקובץ הקיים.
  3. ExecuteExecuteExecute - מאפשרת להריץ את הקובץ.

הרצת קובץ

הרצת קובץ מתבצעת ע"י הוספת "./././" לפני שם הקובץ. על מנת להריץ הקובץ צריך להיות קובץ הרצה(לא קוד ב-CCC!) בעל הרשאות הרצה. אחרת תודפס שגיאה.


> ./main.c
-bash: ./main.c: Permission denied

> gcc main.c -o hello_world
> ./hello_world
Hello World!

שינוי הרשאות קובץ אפשרי בעזרת הפקודה chmod לדוגמה הפקודה:


> chmod u+x <file>

הפקודה הזו משנה את הקובץ הנתון עם הרשאות ל-useruseruser ל-executeexecuteexecute.

אוסף פקודות ב-UNIXUNIXUNIX

קיים מגוון בסיסי של תכניות הזמינות בכל מערכת הפעלה ממשפחת UNIXUNIXUNIX. צורת ההפעלה של התוכניות היא בד"כ מהצורה הבאה:


> <command> [options] [input file]
  • לרוב הפקודות, אם לא יצוין קובץ קלט, הקלט ילקח מהקלט הסטנדרטי על מנת לאפשר הרכבת פקודות.
  • בד"כ ניתן להחליף את הסדר בין שם קובץ הקלט לדגלים.
  • ניתן להשתמש בפקודה manmanman כדי למצוא רשימה מפורטת של כל הפקודות.
הפקודה lslsls

כדי להדפיס תוכן תקייה נשתמש בפקודה lslsls כך:


> ls [flags] [files]
  • ניתן לרשום פשוט lslsls עבור הדפסת תוכן התיקיה הנוכחית
  • ניתן להוסיף את שם התיקיות שאת תוכנן נרצה להדפיס

ניתן להוסיף דגלים כגון:

  • הדגל −l-l−l יגרום להדפסת הפלט כך שכל קובץ מופיע בשורה נפרדת עם מידע נוסף
  • הדגל −a-a−a יגרום לפקודה להדפיס גם פריטים נסתרים (כאשר פריט נסתר ב-UNIXUNIXUNIX הוא כל קובץ או תקייה ששמם מתחיל בנקודה - ...)

ניתן לשלב את הדגלים כך:


> ls -a -l [files]

כאשר משלבים דגלים ניתן גם לכתוב כך:


> ls -al [files]

זוהי אותה פקודה בשני דרכים שונות.

ניהול תיקיות
  • הפקודה pwdpwdpwd מדפיסה את שם התקייה הנוכחית
  • הפקודה cdcdcd מאפשרת להחליף את התקייה הנוכחית
  • הפקודה mkdirmkdirmkdir מאפשרת ליצור תקייה חדשה.
  • הפקודה rmdirrmdirrmdir מאפשרת למחוק תקיה ריקה.

> cd ~
> pwd
/usr/030/moshe

> cd matam
matam: no such fle or directory.

> mkdir matam
> cd matam
> pwd
/usr/030/moshe/matam

> cd ..
> rmdir matam
ניהול קבצים
  • הפקודה cpcpcp משמשת להעתקת קבצים או תיקיות. ניתן להשתמש בה בשני דרכים:
    1. ליצור העתק חדש של file1file1file1 בשם file2file2file2 כך:
      ‎ > cp [options] <file1> <file2>
      
    2. ליצור העתקים חדשים של כל הקבצים בתיקיה קיימת:
      ‎ > cp [options] <file1> ... <filen> <directory>
      
    אם כבר קיים קובץ בעל השם המבוקש הוא נמחק ומוחלף.
    הדגלים:
    • הדגל −r-r−r מבצע העתקה רקורסיבית של תיקיות ותוכנן (ללא הדגל זה תיקיות אינן מועתקות)
    • הדגל −i-i−i מבקש אישור לפני מחיקת קובץ קיים.
  • פקודה mvmvmv משמשת להעברת קבצים או תיקיות או שינוי שמם. ניתן להשתמש בה בשני דרכים:
    1. שינוי שמו של file1file1file1 ל-file2file2file2:
      ‎ > mv [options] <file1> <file2>
      
    2. עובדת גם עבור תיקיות:
      ‎ > mv [options] <file1> ... <filen> <directory>
      
      אם הפרמטר האחרון הוא שם של תקייה קיימת הפקודה מעבירה את הקבצים לתוכה.
      אם קיים כבר קובץ בעל השם המבוקש הוא נמחק ומוחלף.
      הדגלים:
    • הדגל −i-i−i מבקש אישור לפני מחיקת קובץ קיים.
  • הפקודה rmrmrm מאפשרת מחיקת קבצים או תיקיות:
    ‎ > rm [options] <files>
    
    הדגלים:
    • הדגל −r-r−r מבצע מחיקה רקורסיבית של תיקיות (ללא דגל זה ספריות אינן נמחקות)
    • הדגל −i-i−i מבקש אישור לפני מחיקת קובץ
    • הדגל −f-f−f לא מבקש אישור בשום מקרה
      שימו לא ניתן לשחזר קבצים שנמחקו.
      הפקודה הבאה מוחקת את כל הקבצים והספריות במיקום הנוכחי ועלולה להיות הרסנית למדי:
    ‎ > rm -rf *
    

נסתכל על דוגמה לעבודה עם קבצים:


> ls
hello.c private/ story.txt

> cp hello.c prog.c
> ls
hello.c private/ prog.c story.txt

> ls private
example.txt program.c

> rm -i private/example.txt
rm: remove regular file 'private/example.txt'? y

> rm private
rm: cannot remove directory 'private': Is a directory

> rm -rf private
> ls
hello.c story.txt
הדפסת תוכן של קבצים
  • הפקודה catcatcat מדפיסה למסך את תוכן הקובץ.
    ‎ > cat <file>
    
    אם הקובץ גדול המסך יגלול ולא נוכל לראות בנוחות את התחלתו. אם לא מופיע שם קובץ הפקודה מדפיסה את הקלט הסטנדרטי(בדרך כלל מהמקלדת). (אנחנו נראה למה זה טוב בהמשך)
  • הפקודה lesslessless היא כמו catcatcat רק שהיא גם מאפשרת גלילה בשני הכיוונים ועוד אפשרויות
    ‎ > less <file>
    
    • הפקודה diffdiffdiff מאפשרת לשוות בין תוכן של 2 קבצים נפרדים.
      ‎ > diff [options] <file1> <file2>
      
      הפקודה משווה בין תוכן הקבצים שורה אחר שורה. אם הקבצים זהים לא מודפס דבר. אם הקבצים אינם זהים מודפסות השורות השונות ומספרי השורות הרלוונטים.
  • הפקודה echoechoecho מדפיסה את הפרמטרים שקיבלה
    ‎ > echo [-n] [words]
    
    הדגל −n-n−n מדפיס ללא ירידת שורה.

סיכום פקודות

הפקודההפעולה שלה
lslslsמדפיס רשימה של שמות קבצים
cdcdcdמשנה את המיקום הנוכחי
pwdpwdpwdמדפיס את מיקום התיקייה הנוכחית
mkdirmkdirmkdirיוצר תיקייה חדשה
rmdirrmdirrmdirמוחק תיקייה ריקה
cpcpcp

הפניית קלט/פלט

ערוצי קלט-פלט

לכל תוכנית יש ערוצי קלט וערוצי קלט. אלו הן הדרכים בהן היא מקבלת קלט ומציגה את הפלט שלה.
לכל תכנית קיימים ב-UNIXUNIXUNIX שלושה ערוצי ברירת מחדל:

  1. ערוץ הקלט הסטנדרטי: ממנו מקבלת התכנית את הקלט כאשר ברירת המחדל היא המקלדת.
  2. ערוץ הפלט הסטנדרטי: אליו מודפס הפלט כאשר ברירת המחדל היא הדפסה לטרמינל.
  3. ערוץ השגיאות הסטנדרטי: ערוץ פלט נוסף המשמש להדפסת הודעות שגיאה כאשר ברירת המחדל היא הטרמינל.

הפניית קלט/פלט

בעת קריאה לפקודה בטרמינל ניתן להפנות את ערוצי הקלט והפלט הסטנדרטיים לקבצים.
הפניית ערוץ הפלט הסטנדרטי נעשית באממצעות האופרטור ">>>":


> command [arguments] > <output_file>

הפניית ערוץ הקלט הסטנדרטי נעשית באמצעות האופרטור "<<<":


> command [arguments] < <input_file>

הפניית ערוץ השגיאות הסטנדרטי נעשית באמצעות האופרטור "2>2>2>":


> command [arguments] 2> <errors_file>

אם ננסה לכתוב לתוך קובץ קיים, נדרוס את תוכן הקובץ הקיים.
אם ברצונינו להוסיף את הפלט להמשכו של קובץ קיים ניתן להשתמש ב-">>>>>>" או "2>>2>>2>>" בהתאמה.

בנוסף, ניתן להפנות מספר ערוצים בבת אחת. הפניית הקלט ופלט יחדיו נעשית כך:


> command [arguments] < input > output

כדי להפנות את ערוץ השגיאות והפלט נרשום כך:


> command [arguments] > output 2> errors

כדי להפנות את ערוץ השגיאות לערוץ הפלט נכתוב:


> command [arguments] 2>&1

כדי להדפיס את ערוץ הפלט וערוץ השגיאות לאותו הקובץ יש לכתוב:


> command [arguments] > output 2>&1

הרכבת פקודות

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

דוגמה

נניח שברצונינו להדפיס את התוכן של תיקיה המכילה הרבה קבצים.
נוכל להשתמש בהפניית הפלט לפקודה lesslessless על מנת שנוכל לראות את כל הקבצים:

ls -l > tmp
less < temp
rm temp

במקום לעשות את זה נוכל להרכיב את הפקודות כך:

ls -l | less

נשתמש ב-∣|∣ כדי לחבר בין פקודות כך:

command1command2command3\begin{array}{c|c} command1 & command2 & command3 \end{array}command1​command2​command3​
דוגמה

ls | grep test