סוגי ממשקים למשתמש, הרצת תוכניות ב-Unix

 

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

 

הממשק הגראפי GUI או Graphical User Interface כיום בדרך כלל שילוב של חלונות, תפריטים, אייקונים ושימוש בעכבר הנפוץ מאד היום.  דוגמאות קלאסיות הם הממשקים ב-Windows, Mac ו-X-Windows של UNIX.

 

הממשק הטקסטואלי  או שורת הפקודה command line – זוהי השיטה הישנה יותר שבו המשתמש בדרך כלל מקבל בהקשר זה או אחר אפשרות להקליד שורה של טקסט המהווה פקודה למחשב לבצע.  דוגמאות  לכך יש ב-cmd, command.com של  Windows

 ו-DOS, ה-shell-ים של UNIX  והאופציה הזו קיימת בכל מערכת הפעלה.

 

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

 

הממשק הטקסטואלי נעשה ע"י הקלדת שם תוכנית עם פרמטרים ואופציות.  במערכת כמו UNIX שבה בדרך כלל נעבוד, התוכניות הללו הם בדרך כלל קבצים בינאריים שהתקבלו מקמפול של תוכניות בשפות תכנות רגילות כמו C או ++C.  אלא שב-UNIX (כמו הרבה מערכות אחרות) המשתמש יכול לנצל שורה של אופציות לנתב את פעולות התוכניות הללו לכיוונים רצויים לו על ידי קריאה לתוכניות הללו בצורה מסוימת, הוא יכול לשלב באופן די מפתיע תוכניות בלתי תלויות בכדי לקבל פעולות חדשות ספציפיות הרבה יותר מהתוכניות המקוריות. ויותר מכך: המשתמש או אחראי המערכת יכול לכתוב קובצי טקסט אשר קוראות לתוכניות רגילות יחד עם תיאור האופציות המיוחדות ולהריץ אותם כפעולות חדשות. קבצים כאלו נקראים בטרמינולוגיה של UNIX סקריפטים (scripts) המושג הדומה ביותר ב-WINDOWS זה קובצי BAT.

 

מסלולי ספריות ב-unix

 

במידה מסוימת כמו ב-DOS אבל יש שני הבדלים עיקריים:

 

-         ב-unix המפריד בין שמות ספריה הוא התו '/' ולא '\' כמו ב-DOS.

-         ב-unix אין מושג מקביל לכונן (למשל  "D:", "C:") ב-DOS. כל הספריות נמצאות בעץ ספריות אחד שסימונו '/'. 

 

לפיכך התייחסויות לקבצים וספריות נראים כמו /usr/bin, /home/user וכו'.

 

Unix מבחין בין אותיות גדולות וקטנות בשמות קבצים וספריות, השמות  temp  ו-Temp הם לא אותו דבר.

 

  כאשר אתה כותב שם של פקודה, אם היא לא שם פנימי של תוכנת הממשק (הקרויה shell) התוכנה תחפש את הקובץ הביצועי לפי המצוין במשתנה path או PATH.  זה תלוי איזה shell אתה משתמש.  בכדי לראות את הערך של המשתנים הללו הרץ את הפקודה

 

echo $path

או

echo $PATH

 

 

פקודות בסיסיות בממשק טקסטואלי של unix

 

   לשם עבודה בסיסית ביוניקס, נחוצות הפקודות הבאות:

 

man  -  פקודה לקבלת מידע על פקודות

 

ls -   הדפס רשימות קבצים

 

mkdir  - צור תת ספריה חדשה

 

rmdirמחק תת ספריה (שחייבת להיות ריקה)

 

rmמחק קבצים

 

cp  או ספריות העתק קבצים

 

mv -  העבר או שנה שם של קובץ או ספריה

 

catשרשור קבצים

 

pico  - תוכנית עריכה לקובצי טקסט

 

cc  -  C מהדר לשפת

 

grep  - מסנן שורות טקסט

 

g++ -   C++מהדר לשפת  

 

moreהדפס  קובץ טקסט בצורה מבוקרת על המסך

 

less - more גרסה משופרת של

 

diffהדפס הבדילם בין קבצי טקסט

 

 

עבור רוב הפקודות ב-unix, אם התוכנית לא סיימה ואתה רוצה לעצור או לצאת ממנה, תוכל לעשות זאת ע"י  לחיצת "Ctrl-C"  או "Ctrl-\".  אפשר גם להשהות את ביצוע הפקודה ע"י לחיצת "Ctrl-Z". 

 

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

   לדוגמא,

ls *.c

ידפיס את כל הקבצים בספריה הנוכחית שיש להם סיומת .c.

 

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

 

ls | more

 

או

ls | less

 

 

 

 

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

 

  לדוגמא,

 

man ls

 

ייתן לך את המידע על הפקודה ls.

  אם תוכן המידע הוא ארוך יותר ממסך אחד, הדפסת המידע תיעצר בסוף המסך עד שתלחץ "רווח" (לדף הבא) חץ למטה (לרדת שורה) או "q" לצאת.  לפעמים אפשר לחזור אחורה ע"י "b" או "חץ למעלה".  למעשה אפשר לומר שהפקודה man קוראת באופן אוטומטי ל-more או less.

 

לפקודה ls יש את השימושים הנפוצים הבאים:

 

ls –l  -  תן פירוט מלא על הקבצים ספריות

 

ls –t   -   מין לפי זמן (ראשון הכי חדש)

 

ls –a  -  הדפס גם קבצים המתחילים ב-'.'  

 

ls –r  - הדפס בסדר הפוך

 

אפשר לשלב אופציות, למשל הפקודה

lslrt

ידפיס את הקבצים לפי הזמן בסדר הפוך, הכי חדש אחרון.

 

יצירת תת ספריה , נניח בשפם temp, תעשה ע"י פקודה

mkdir temp

מחיקת תת ספריה ריקה באותו שם יעשה ע"י הפקודה

rmdir temp

 

מחיקת קובץ בשם x.txt יעשה ע"י הפקודה

rm x.txt

 

הפקודה הבאה תמחוק תת ספריה בשם directory וכל תתי הספריה שלה:

 

rm –r directory

 

בכדי להעתיק קובץ משתמשים בפקודה cp. לדוגמא, אם אתה רוצה להעתיק קובץ בשם hello1.c  לקובץ בשם hello2.c השתמש בפקודה

 

cp hello1.c hello2.c

 

במידה ויש קובץ בשם hello2.c הוא יידרס ללא אזהרה.  אם ברצונך לקבל אזהרה במקרה של קיום קובץ בשם היעד השתמש בפקודה

 

cpi hello1.c hello2.c

 

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

 

cp hello1.c hello2.c backup_dir

cp *.c  backup_dir

 

שינוי שמות או מיקומים של קבצים/ספריות משתמשים בפקודה mv. היא דומה למדי בשימוש שלה ל-cp.

בכדי לשנות שם של קובץ נשתמש בפקודה mv בגרסה של 2 שמות קובץ, למשל

 

mv a.out hello

 

אם קיים קובץ בשם hello הוא יידרס ללא אזהרה.  הגרסה הזהירה של הפקודה היא עם האופציה i לדוגמא:

mvi a.out hello

 

ל-mv  יש גרסה של רשימת פרמטרים שהם רשימת קבצים ושם ספריה. במקרה הזה שמות הקבצים אינם משתנים אבל הם "עוברים" לספריה הנתונה. לדוגמא

 

mv hello1.c hello2.c backup_dir

mv *.c  backup_dir

 

אם אתה רוצה לשרשר מספר קבצים לקובץ אחד בצע פקודה נוסך

 

cat רשימת קבצים > קובץ חדש

לדוגמא,

cat file1.txt file2.txt file3.txt > file4.txt

 

אם היה קודם קובץ בשם file4.txt  הוא יידרס.  אסור ששם קובץ היעד יהיה ברשימת קובצי המקור. 

 

 

על מנת לערוך קובץ בשם hello.c או ליצור חדש בשם הזה נריץ את הפקודה

 

pico hello.c

 

כתיבה לדיסק יעשה ע"י לחיצת "Ctrl-O" ויציאה ע"י  "Ctrl-X".  עזרה תתקבל ע"י "Ctrl-G".  על המסך מופיעים לחיצות נוספות מסוג זה, הכוונה שלהם ב-"^X" הוא ל-"Ctrl-X".

 

בכדי לקמפל תוכנית C, נניח hello.c  אתה מריץ את הפקודה

 

cc hello.c

קובץ בשפת C חייבת להיות עם סיומת .c

 

במקרה של קמפול מוצלח תקבל פקודה ביצועית בשל a.out. בכדי להריץ אותה עליך לכתוב פשוט

./a.out

בדרך כלל מספיק

 

a.out

אם אתה רוצה קובץ בשם אחר מאשר a.out השתמש באופציה –o למשל

 

cc hello.c –o hello

ואז הקובץ הביצועי יהיה  בשם hello.

אם בתוכנית ה-C אתה משתמש בפונקציות מתמטיות, (כמו sin, sqrt ...) השתמש באופציה –lm למשל

 

cc –lm prog.c

 

הפקודה grep  מדפיסה שורות מתוך קובצי טקסט שמקימים תנאים מסוימים.  לדוגמא, נניח שאני רוצה לראות את כל הפקודות printf בקובץ hello.c:

 

grep printf hello.c

 

למעשה כל הפרמטרים למעט הראשון (שהוא מחרוזת) יכולים להיות רשימה של קבצים. למשל

 

grep printf *.c

 

 

 

אם יש לך שני קבצים כמעט זהים (למשל שתי גרסאות של אותה תוכנית) ואתה רוצה לראות את ההבדלים ביניהם, השתמש בפקודה diff למשל:

 

diff hello1.c hello2.c

 

 

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

 

1.     אופציות

האמצעי הראשון שקיים ברוב תוכניות השרות של UNIX הוא ניצול האופציות.  לרוב  תוכניות השרות והפקודות יש אופציות שמשנות את משמעות הפקודה.  ברוב מכריע מהמקרים אופציה מצוינת עם מינוס (-) מקדים.

לדוגמא, לפקודה cp  של העתקת קבצים יש אופציה i שגורמת לפקודה שלא לדרוס קבצים קיימים לבלי לשאול את המשתמש קודם.  האופציה  -r גורם לו להעתיק תתי ספריות ולא רק קבצים.  לדוגמא,  הפקודה

 

cpi f1.c f2.c

 

יעתיק את הקובץ f1.c  (במידה וקיים) לקובץ f2.c   בתנאי ש-f2.c לא קיים כרגע.  במידה וקיים קובץ בשם f2.c  התוכנית תשאל את המשתמש אם הוא רוצה לדרוס אותה.

במידה והיינו מותרים על הi ההעתקה הייתה מתבצעת בכל מקרה ש-f1.c קיים, תוך דריסת f2.c  במידה והיה קיים.

 

2. פרמטרים לתוכנית ראשית (או העדרם)

 

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

  ברוב הפקודות, העדר מוחלט של פרמטרים גורם לפקודה לתת עזרה למשתמש. לדוגמא ב-LINUX הרצת cp ללא פרמטרים ייתן את התגובה הבאה:

 

% cp

cp: missing file arguments

Try `cp --help' for more information.

%

 

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

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

% cat hello.c

#include <stdio.h>

void main()

{

  printf("\nHello World!\n");

}

%

 

 

 

 

3. ניתוב

 

ב-UNIX ישנם מספר מנגנונים המאפשרים למשתמש/מתכנת ליצור תוכנית שרות המהווה מעין הרכבה של שניים או יותר תוכניות שרות סטנדרטיות:

1. דרך אחת היא להשתמש במנגנון המאפשר לנתב תוכניות שרות כך שהפלט של תוכנית המופנה בדרך כלל למסך יופנה לקובץ, ושקלט של תוכנית שמקורו בדרך מהמקלדת יבוא מקובץ קיים.

2. דרך נפוצה מאד היא להפנות פלט של תוכנית שרות ישירות להיות קלט של תוכנית שרות של תוכנית אחרת.  מנגנון זה נקרא  pipe. 

3.  ישנה אפשרות נדירה יחסית שבה פלט של תוכנית תהיה פרמטר לתוכנית ראשית של תוכנית אחרת.

 

פירוט

 

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

דוגמאות:

 

ls –l > filelist

 

יצור קובץ  בשם filelist שיכיל את התשובה שהפקודהls –l   בדרך כלל שופך על המסך (רשימת הקבצים בספריה הנוכחית כולל חלק מהמאפיינים).  אם היה כבר קובץ בשם filelist התוכן הקודם שלו יאבד. לאומת זאת במקרה של הפקודה

 

ls –l >> filelist

 

במידה ו-filelist לא היה קיים לא יהיה הבדל בין הפקודה הזו לקודמת, אולם במידה והיה קובץ בשם הזה, הפלט של הפקודה יתווסף לסוף הקובץ הקיים במקום לדרוס אותו.

 

 

ב. קבלת קלט מקובץ במקום מהמקלדת נעשה ע"י האופרטור > בצורה דומה לאופרטור הפלט. לדוגמא, הפקודה  mail הישנה מאפשרת למשתמש להקליד מכתב אלקטרוני ישירות מהמקלדת באמצעות תוכנת עריכה פרימיטיבי, אבל מאר ותוכנית העריכה לא הייתה נוחה, משתמשים היו מקלידים לתוך קובץ זמני את המכתב ושלוחי אותו ע"י הפקודה

mail user@mail.server < tmpfile

 

ג. סעיף א משפיע על הפלט הרגיל של התוכנית.  אם רוצים לנתב את הודעות השגיאה לקובץ צריך לעשות זאת ע"י האופרטור <2 לדוגמא

 

cp * /tmp 2> errmsgs

 

תבצע העתקה של כל הקבצים בספריה הנוכחית לספריה /tmp אבל אם יהיו בעיות (כמו קבצים קיימים באותו שם בספריה בבעלות משתמש אחר) הודעות השגיאה ישמרו בקובץ errmsgs ולא למסך.

איחוד של הודעות השגיאה והפלט הרגיל מתבצע ע"י האופרטור &<.  לדוגמה

הפקודה

ls –l * >& output.txt

 

ישמור הן את הפלט הרגיל (פרטים על קבצים וספריות, כלל רשימת הקבצים בתתי הספריות, רמה אחת כלפי מטה) והודעות השגיאה לקובץ output.txt.  הודעות שגיאה יכולות להיות שהמשתמש אינו רשאי לקרוא את קובצי תת בספריה.

  

 

2.                 pipes

 

  האמצעי pipe אשר נקרא ע"י האופרטור | גורם לפלט של תוכנית אחת להיות הקלט של תוכנית שנייה.  שימושים קלאסיים של האופציות הללו הם

ls –l | more

 

הגורם לתשובה של הפקודה ls –l שלא "לברוח" אם היו יותר מ-25 שורות. הפקודה  more קוראת תוכן טקסטואלי בצורה כזו שהיא נעצרת כל אימת שהמסך מתמלא ומחכה ללחיצת מקש.  דוגמא נוספת היא

 

ls –l | grep drwx | more

 

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

 

3.     העברה כפרמטר לתוכנית ראשית.

נעשה ע"י האופרטור ` `. לדוגמא הפקודה

 

ls -l `which grep`

 

תיתן פלט נוסך

 

-rwxr-xr-x    1 root     root        75668 Jan 25  2003 /bin/grep

 

זאת משום שהפקודה which מפרטת את מיקום הקובץ של שם תוכנית נתונה ב-path.

 

 

 

  רקע

 

מתכנתים בשפת C יתקלו במוקדם או במאוחר במושגים Standard input (stdin), Standard output (stdout)   ו-Standard error (stderr).  אלה הם מקור הקלט הסטנדרטי – המקלדת היא ברירת המחדל -, יעד הפלט הסטנדרטי ויעד הודעות השגיאה – המסך כברירת המחדל לשניהם.  מקור הקלט הסטנדרטי הוא המקור לפקודות scanf, getchar, gets ואחרים ויעד הפלט הסטנדרטי הוא היעד של פקודות printf, putchar, puts ואחרים.  ליעד הודעות השגיאה חייבים לציין אותו למשל fprintf(stderr, אבל גם לקודמים אפשר לעשות זאת למשל fscanf(stdin, fprintf(stdout.  אפשר לנתב את הערוצים הללו מחדש לברירות המחדל שלהם (למשל ע"י הפקודותfreopen , dup, close).  מה שהאופרטורים >, <, <<  ו-| עושים זה למעשה לנתו את הערוצים הסטנדרטיים הללו ליעדים חדשים, אם לקבצים או במקרה של pipes  ה-stdout של תוכנית אחת הא ה-stdout של תוכנית אחרת.

 

הפקודה df

 

  ב-unix אין כוננים.  ישנו עץ ספריות אחד וכל ההתקנים של מידע (דיסקים, CD, צורבים, disk on key, דיסקטים) ממופים (mounted) לתתי ספריות שמשמשות למעשה כממשקים אל ההתקנים הללו בצורה דומה לשמות הכוננים (C:, D:) ב-Windows.  בכדי לראות את ההתקנים והיכן הם ממופים, הרץ את הפקודה df.

 

לדוגמא,

 

% df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda1            139048656  71664196  60321180  55% /

none                    515128         0    515128   0% /dev/shm

/dev/sda2              1031640     39972    939264   5% /tmp

 

%