סוגי ממשקים למשתמש, הרצת תוכניות ב-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 - הדפס בסדר הפוך
אפשר לשלב
אופציות, למשל הפקודה
ls –lrt
ידפיס את
הקבצים לפי הזמן בסדר הפוך, הכי חדש אחרון.
יצירת תת
ספריה , נניח בשפם 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 הוא
יידרס ללא אזהרה. אם ברצונך לקבל אזהרה
במקרה של קיום קובץ בשם היעד השתמש בפקודה
cp –i 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 לדוגמא:
mv –i 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 גורם לו להעתיק תתי
ספריות ולא רק קבצים. לדוגמא, הפקודה
cp –i 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
%