מדריך: שורת הפקודה



  • הבהרות

    הבהרה1: נא לסלוח על טעויות כתיב והחלפות זכר לנקבה וכדו', עברית היא לא שפת אם שלי
    הבהרה2: יש הרבה שורות פקודה, נשתדל לא להתמקד בשום אחד מהם אלא לדבר על דברים שקשורים לכולם
    הבהרה3: אין צורך בשום ידע מוקדם, חוץ מלדעת איפה נמצא כפתור ההפעלה של המחשב...
    הבהרה4: אין שום התחייבות להמשיך את הסדרה, זה על בסיס זמן פנוי וחשק...
    הבהרה5: למען הסדר הטוב, פתחתי עוד נושא לתגובות, נא להגיב שם. כאן אני מתכוון להעלות המשכים לסדרה.
    הבהרה6: בל"נ לא יהיו עוד הבהרות ומיד ניגש לענין...

    הקדמה: שורת הפקודה מהו

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

    שורת הפקודה = סביבה מבוסס טקסט שבה מריצים תוכנות (לרוב, פקודות לא אינטראקטיביות), (CMD ב-Windows ו-DOS (ז"ל) או Powershell בווינדוס, bash, sh, וכו' בלינוקס, וכו')

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

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

    • מקום לקלט (input) - כאן מזינים את הפקודות.
    • מקום לפלט (output) - כאן מקבלים תוצאות. (בד"כ זה אותו חלון של הקלט)
    • PROMPT (הנחיה?) - רמז ויזואלי שהסביבה מוכן לקבל קלט. כאשר פקודה רצה, הסמן המהבהב נמצא בשורה בפנ"ע בלי PROMPT לפניה (לפעמים יש פלט של הפקודה שרצה, לפעמים לא). כאשר הפקודה מסתיימת, ושורת הפקודה מוכנה לקבל עוד פקודה, מודפס שוב שורת ה-PROMPT ואח"כ סמן מהבהב, זה סימן שאפשר להתחיל לכתוב עוד פקודה.
      זה נראה משהו כזה בווינדוס:
    C:\Users\yossi>_
    

    (למה כתוב נתיב ב-PROMPT? נגיע לזה יותר מאוחר).

    רכיבים של "פקודה" (תוכנה לא אינטראקטיבית)

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

    קלט

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

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

    דוגמא:

    echo "Hello, World!"
    

    echo הוא שם הפקודה. פקודה זו לוקחת את הפרמטרים ופולט אותם החוצה, בלי להפעיל עליהם שום חישובים.
    "Hello, World!" הוא פרמטר שהפקודה מקבלת.
    הפלט:

    Hello, World!
    

    אפשר להזין יותר מפרמטר אחד. וכל פרמטר יכול להכיל יותר ממילה אחת. בד"כ רווח מחלק בין פרמטרים, אם כותבים גרשיים מסביב למילים זה מחבר אותם לפרמטר אחד. הפקודה echo יכולה לקבל יותר מפרמטר אחת. לפי"ז הייתי יכול לכתוב:

    echo Hello, World!
    

    ואז זה היה מתורגם לפקודה עם 2 פרמטרים - "Hello," ו-"World!". במקרה שיש יותר מפרמטר אחד, הפקודה echo פולט אותם החוצה עם רווח ביניהם, ונקבל אותו פלט.
    אמנם, מה יקרה אם נכתוב:

    echo "Hello,       World!"
    echo Hello,       World!
    

    הפלט יהיה:

    Hello,       World!
    Hello, World!
    

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

    עוד דרכים להזנת קלט:

    • קבצים
    • משתני סביבה

    פלט

    • טקסט מודפס בחלון שורת הפקודה
    • פעולה שקורה (למשל כיבוי המחשב)
    • קבצים
    • קוד (מספר) שהתוכנה מחזירה - (return code)
    • ....

    ההמשך יבוא... (אולי כן, ואולי לא...)



  • פקודות פנימיים לעומת פקודות חיצוניים

    פקודות מגיעות ב2 טעמים - פנימי וחיצוני.
    פקודה חיצונית הוא תוכנה מהמחשב - לדוגמא אם נכתוב בשורת הפקודה notepad זה יריץ את הכתבן מהנתיבC:\Windows\notepad.exe. אבל יש גם פקודות שממומשות ע"י ה-shell עצמה. נזכיר, ש-shell = סביבה שמתוכה מריצים פקודות. ה-shell הוא גם תוכנה וחלק מהפקודות ממומשות על ידה בלי צורך להריץ תוכנה חיצונית.
    למשל, בכל ה-shellים, יש פקודה cd לשינוי תקייה נוכחי, פקודה זו חייבת להיות פקודה פנימית כי אין דרך לתוכנה חיצונית לשנות את התקייה הנוכחית לתהליך האב שלה. אם נכתוב ב-bash או ב-CMD את הפקודה (הפנימית) help נקבל רשימה של פקודות פנימיות. (ב-CMD, הרשימה כולל ג"כ פקודות חיצוניות, ב-bash לא).

    למה חשוב לדעת אם זה פנימי או חיצוני? שאלה טובה... (ב-bash, העזרה המובנית הוא רק לפקודות פנימיות, ב-CMD כמו ב-CMD המצב יותר מסובך...)

    תווים מיוחדים

    כמו שכבר הזכרנו בפוסט הראשון, הדרך להריץ פקודה הוא - לכתוב את שם הפקודה, ואח"כ פרמטרים. הפרמטרים מועברים לפקודה ע"י ה-shell. בד"כ הפרמטרים לא עוברים עיבוד ע"י ה-shell, אלא מועברים כמו שנכתבו. זה נכון כאשר אין תווים מיוחדים, כאשר יש תווים מיוחדים, תווים אלה יש להם משמעות מיוחדת ל-shell והם לא מועברים לפקודה אלא מתורגמים ע"י ה-shell. לכל shell יש כללים משלו מה נחשב לתו מיוחד, ואיזה פעולה כל תו יעשה. למשל ב-bash נחשב רווח כתו מיוחד, כאשר ה-shell פוגש ברווח, זה אומר לו: כאן סוף פרמטר, התו הבא שאינו רווח מתחיל פרמטר שני. משום כך לא משנה כמה רווחים תשים בין המילים, הפקודה תמיד יקבל את המילה שלפני הרווחים כפרמטר 1, והמילה שאח"כ כפרמטר 2, והרווחים נבלעים ע"י ה-shell.
    ב-CMD כמו ב-CMD המצב יותר מסובך... כל מה שמגיע אחרי הפקודה מועבר לפקודה (כולל כל הרווחים). עכשיו הפקודה עצמה יכול לבחור עם לעבד את הפרמטרים בעצמו (עם הכללים שהוא ירצה לייצר לעצמו) או להעביר את המחרוזת לווינדוס לעבד אותו לפי כללים ידועים.
    רוב הפקודות מעבירים את המחרוזת לעיבוד לפי הכללים הידועים. ובהם תקף הכלל הנ"ל שרווח מפסיק בין הפרמטרים, וגרשיים מחבר.
    תוכנות שנכתבו ב-C (שפת תיכנות ישישה ומכובדת) יעברו עיבוד אוטומטי ע"י ה-CRT (סביבת ההרצה של C - בעיקרון של ווינדוס שכבת תאימות עבור שפת C). (יש גם אפשרות לכתוב ב-C בלי לכלול את ה-CRT, אבל זה שייך ל"תכנות אקסקלוסיבי"...) התוכנה יכולה לבחור בכל זאת להתעלם ולהשתמש במחרוזת המקורית.

    איך מעבירים רווח לפקודה שמשתמש ברווח כתו מיוחד? למשל אם נרצה למחוק קובץ בשם c:\new file1.txt, אם נכתוב כך:

    del c:\new file1.txt
    

    נקבל תשובה

    Could Not Find c:\new
    Could Not Find C:\WINDOWS\system32\file1.txt
    

    כלומר שהקובץ new (פרמטר 1) לא נמצא, והקובץ file1.txt (פרמטר 2) לא נמצא. אנחנו צריכים לכתוב בפרמטר אחד את כל שם הקובץ, אבל שם הקובץ כולל רווח - שמחלק בין פרמטרים? בשביל זה יש עוד תו מיוחד ". הגרשיים מחברים כל מה שבתוכם לפרמטר אחד.

    del "c:\new file.txt"
    

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

    תווים מיוחדים ב-CMD

    כמו שהזכרנו, ב-CMD יש תווים שהתוכנה יכולה לבחור אם הם יחשבו כתווים מיוחדים או לא. יש תווים שהם מיוחדים מיוחדים... והם לא יועברו לתוכנה בשום פנים, ואלו הם:
    < > ^ | & ו-enter. (אולי יש יותר?)
    איך כותבים תווים אלו בלי שיתורגמו באופן מיוחד ע"י CMD ויועברו ישירות לפקודה? כותבים ^ לפני התו: ^| ^< ^> ^^ ^& ו- ^+enter.
    התו ", גם כן מיוחד קצת... כי תו מיוחד אחר (חוץ מ-enter) שמגיע אחרי ה" הפותח ולפני ה" הסוגר כבר לא נחשב כתו מיוחד.
    אני מאמין שיש עוד כמליון ואחד פרטים לגבי טיפול בתווים מיוחדים ב-CMD... מי שמכיר מוזמן לכתוב באשכול התגובות.



  • משתני סביבה

    מה זה "משתנה"?

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

    msg yossi שלום Yossi!
    msg yossi שלום Dovid!
    ....
    ....
    

    (הפקודה msg מקבל 2 פרמטרים: שם המשתמש שיראה את ההודעה, ותוכן ההודעה. שם המשתמש במקרה זו הוא yossi והתוכן הוא "שלום פלוני!")

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

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

    למשל אכתוב:

    msg %username% שלום %ploni%!
    

    עכשיו ה-shell יבדוק עם יש משתנה מוגדר בשם "USERNAME", ותמיד יש כזה כי זה משתנה שמוגדר אוטומטי ע"י המערכת, וערכו הוא שם המשתמש הפעיל - בדוגמא שלנו "yossi". ה-shell ימחוק את השם של המשתנה ובמקום זה ימלא את הערך "yossi".

    עכשיו ה-shell יעבור לבדוק עם יש משתנה בשם PLONI. מכיון שאין, נצטרך להגדיר אחד כזה. ב-CMD עושים את זה כך:

    set PLONI=Dovid
    

    אם עכשיו נריץ אתת הפקודה - התוצאה:
    48a83b44-f3e1-4612-93fc-2f8601cef566-image.png

    משתני סביבה

    משתנה שמוגדר כ"משתנה סביבה" הוא משתנה ששייך לתהליך וכל התהליכים הבנים יקבלו אותו בירושה מהאבא. ב-CMD, כל המשתנים הם משתני סביבה. אם תגדיר משתנה, ואז תריץ פקודה - המשתנה יהיה מוגדר גם בתהליך של הפקודה שרצה. ב-bash יש 2 סוגים, משתנה רגיל, ומשתנה סביבה.

    אפשר לראות (וגם לערוך) משתני סביבה של תהליך בתוכנת Process Hacker
    a42ea64d-b4ec-4e46-83a5-9a67dbdd46e6-image.png
    אפשר לראות משתני הסביבה של תהליך CMD ע"י הפקודה set בלי פרמטרים.

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


התחבר כדי לפרסם תגובה
 

12
מחובר

1.3k
משתמשים

4.7k
נושאים

52.0k
פוסטים

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

כנסו לאתר לקניה מקוונת, או בדקו סניף קרוב לביתכם.

מוצרים עם הנחה

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

בהגעה דרך הלינק, ישנה הנחה בשלב התשלום בקופה!

בא תתחבר לדף היומי!