מדריך שורת הפקודה - חלק שני

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

Authors
  • Name
    YossiZ
    Published on
    Twitter

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

פקודות מגיעות ב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... מי שמכיר מוזמן לכתוב בתגובות.