איך להריץ תוכנה מתוך שורת הפקודה?

חלק רביעי למדריך שורת הפקודה

Authors
  • Name
    YossiZ
    Published on
    Twitter

(למרות שכתבתי מראש שאני לא רוצה להתמקד על מימוש מסויים של שורת פקודה, אני רואה שיש יותר מדי הבדלים דקים בין המערכות ומכיון שהשימוש הנפוץ של קוראי המאמר הוא בווינדוס, לכן מכאן והלאה, אם לא צויין אחרת מדובר ב-CMD - שורת הפקודה של ווינדוס)

אילו פקודות ניתן להריץ משורת הפקודה?

התשובה היא: כל תוכנה (קובץ EXE) שקיימת במערכת (או בדיסק חיצוני) + פקודות מובנות (ראה בפוסט קודם הסבר על פקודות מובנות/פנימיות).

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

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

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

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

ב) גם בהרצה מתוך שורת הפקודות (על ידי כתיבת שם התוכנה ולחיצת אנטר) ווינדוס מבחינה בין השתיים. בהרצת הסוג הגרפי, השליטה תחזור מיד ל-shell אחרי הרצת הפקודה. זה ניכר על ידי הדפסה חוזרת של ה-PROMPT (מה זה PROMPT? אפשר לקרוא עליו בפוסט הראשון של הסדרה). זה אומר למשתמש: "אני מוכן לקבל עוד פקודות". לעומת זאת, בסוג הטקסטואלי, בעת ריצת התוכנה, חלון הפקודות נמצא בשליטת התוכנה, זה מתבטא בזה שאי אפשר להזין עוד פקודות, מה שמצויין על ידי חיסרון שורת ה-PROMPT לפני הסמן המהבהב. זאת כדי לתת אפשרות לתוכנה להדפיס מידע לחלון.

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

כיצד מריצים את תוכנה X מתוך שורת הפקודה?

(לקבל את התשובה המתומצתת, דלג ישר לסוף הפוסט)

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

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

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

כמו שכתבנו בפוסט קודם (ואוו, כבר עברה שנה!) פקודות מגיעות בשני טעמים - פקודות פנימיות ופקודות חיצוניות. הפנימיות הן אלו שה-shell (מתרגם הפקודות) מממש בעצמו (לדוגמה cd), כלומר, אם נריץ את הפקודה (זוכרים עדיין איך? פשוט כותבים את שם הפקודה ולאחריה הפרמטרים ואנטר לקינוח) ה-shell שמאזין לקלט מסתכל במילה הראשונה (שם הפקודה) ומבין שהפקודה מופנית אליו, ואז הוא קורא ומעבד את שורת הפקודה ומגיב בהתאם.
פקודה חיצונית היא פקודה שלא מובנית בתוך תוכנת ה-shell, ה-shell מקבל את הקלט, בודק את שם הפקודה, ואופסס... הוא לא מזהה את הפקודה. ניקח לדוגמה את הפקודה: notepad (כתבן). אם נריץ חיפוש על קובץ ה-EXE של תוכנת CMD, נגלה שהמרוזת "notepad" לא נמצא בתוך הקובץ CMD.EXE בשום צורה שהיא. ובכל זאת CMD יודעת איך לטפל בפקודה.
ההתנהגות של ה-shell עבור כל פקודה שהיא לא מכירה הוא לחפש את מערכת הקבצים עבור קובץ עם שם זהה לשם הפקודה, אם הוא מוצא קובץ כזאת הוא מריץ אותה עם הפרמטרים שהוזנו.

אבל זה הרי ברור שאי אפשר לחפש את כל מליוני הקבצים במערכת הקבצים כדי למצוא תוכנה עם שם "notepad".
התשובה היא ש-CMD מחפש רק בכמה נתיבים מוגדרים מראש. באילו נתיבים?

א) לפני הכל, בספריה הנוכחית. (ומה היא ה"ספריה הנוכחית"? ראה מסגרת.) קודם, CMD יחפש קובץ עם שם זהה לשם הפקודה. אם זה לא נמצא, ינסה CMD למצוא קובץ עם שם זהה לפקודה פלוס אחת מתוך כמה סיומות מוגדרות. בד"כ רשימת הסיומות יכלול: EXE BAT CMD VBS ועוד כמה. ניתן לשלוט על הרשימה באמצעות משתנה הסביבה: PATHEXT.

ב) במידה ולא נמצא אף קובץ מתאים בתיקייה הנוכחית, יתחיל CMD לחפש בתוך רשימה מוגדרת של נתיבים נוספים. ניתן לשלוט על רשימת הנתיבים באמצעות מתשנה הסביבה PATH. על מנת להדפיס את ה-PATH הנוכחי, הריצו את הפקודה: set PATH. זה ידפיס רשימה של נתיבים מופרדים באמצעות תו ;

הספריה הנוכחית - (Working Directory)

תהליכים במערכת הפעלה מודרנית אינם רצים בחלל הריק, שורת הפקודה ומערכת ההפעלה בשיתוף פעולה מכינות להם "סביבת ריצה". הסביבה הזאת כוללת המון דברים (כגון משתני סביבה), ובתוכם "ספריה נוכחית" - ז"א תיקיית ברירת המחדל לכל פעולה במערכת הקבצים.
נניח שהתוכנה רוצה לכתוב לתוך קובץ לוג פעילות, או אולי קובץ הגדרות, או משהו אחר, לאן לכתוב את הקובץ? לפעמים יש תיקייה מוגדרת מראש שאליה התוכנה תכניס את כל קבצי הדאטה שלה, ואז היא תגיד למערכת ההפעלה "תייצרי קובץ בשבילי בנתיב C:\XXX\XXX", אפשרות נוספת היא שהיא יכולה להגיד למערכת ההפעלה "תייצרי בשבילי בבקשה קובץ בשם XXX" בלי נתיב, ומערכת ההפעלה תדע לייצר את הקובץ בתוך התיקייה שמוגדרת לתהליך כ"תיקייה הנוכחית".

תוכנת CMD ככל תהליך אחר, גם כן רצה בתוך סביבה שכוללת בין השאר גם כן "ספריה נוכחית". אפשר לראות מהי הספריה הנוכחית בטקסט ה-PROMPT.

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

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

התשובה, לאור הנ"ל היא:

  • אם הפקודה היא מובנית/פנימית - כותבים את שם הפקודה
  • אם הפקודה היא חיצונית - אם הפקודה ממומשת על ידי תוכנה שנמצא בספריה הנוכחית או על ידי תוכנה שנמצא בתוך רשימת הנתיבים שבPATH - ניתן להריץ אותה על ידי כתיבת שם קובץ ה-EXE (עם או בלי הסיומת - בתנאי שהסיומת היא מאלו שנמצאים ברשימת PATHEXT).
  • אם לא מתקיימים אף אחד מהתנאים הנ"ל, חייבים לספק ל-CMD את הנתיב המלא לקובץ, זה יכול להיות נתיב מלא שמתחיל משם הכונן (לדוגמה: c:\windows\system32\notepad.exe), או נתיב חלקי שמתחיל מהספריה הנוכחית (לדוגמה, נגיד שהספריה הנוכחית היא c:\users\yossi והקובץ נמצא בהורדות, נכתוב Downloads\xxx)

⚠ במערכות לינוקס, אי אפשר להריץ תוכנה מתוך הספריה הנוכחית בלי לציין בפירוש ‎./xxxכלומר, נקודה, סלאש, ואז שם התוכנה (נקודה תמיד מציינת את הספריה הנוכחית), זה נכון גם אם הספריה הנוכחית נמצאת במקרה בתוך ה-PATH. בנוסף אי אפשר להשמיט את סיומת הקובץ ובד"כ אין סיומות לקבצי תוכנה. בנוסף חייבים לתת לקובץ התוכנה הרשאות ריצה (קבצים שהותקנו באמצעות מנהל החבילות של המערכת יקבלו את ההרשאה אוטומטית, קבצים שהורדו מהאינטרנט למשל, צריך לתת להם הרשאות ריצה על ידי הפקודה: chmod +x xxx).