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

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

Authors
  • Name
    YossiZ
    Published on
    Twitter

שרשור פקודות

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

קוד יציאה

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

ב-CMD ניתן לקבל את קוד היציאה של הפקודה האחרונה במשתנה %errorlevel%. בbash ניתן לקבלו באמצעות המשתנה ‎$?‎.

שרשור בסיסי

ניתן להשתמש בקוד היציאה של תהליך כדי לשרשר תהליכים בצורות שונות.

  • הרץ את הפקודה השניה רק אם הראשונה הצליחה
command1 && command2
  • הרץ את הפקודה השניה רק אם הראשונה לא הצליחה
command1 || command2

ℹ קוד היציאה של השרשור הוא קוד היציאה של הפקודה האחרונה בשרשור, ייתכן שההתנהגות של ביטויים לוגיים ב-JS (למי שמכיר) הושפע מה-shell

  • הרץ את הפקודה הראשונה ואח"כ את השניה בכל מקרה
    • CMD
    command1 & command2
    
    • bash
    command1; command2
    

If

עוד דרך להשתמש בקוד היציאה כדי להשפיע על הפקודות הבאות היא השימוש בביטוי "if" (=אם).

דוגמאות ב-CMD:

  • אם קוד היציאה של command1 שווה (EQU) 0 (כלומר הצליח) הרץ command2 אחרת הרץ command3:
command1
IF %ERRORLEVEL% EQU 0 (command2) ELSE (command3)
  • אם קוד היציאה של command1 הוא בין 10 ל-20 הרץ command2:
command1
IF %ERRORLEVEL% GTR 10 (
    IF  %ERRORLEVEL% LEQ 20 (
      command2
  )
)

ℹ התחביר של CMD הוא פרימיטיבי קשה ומסורבל לעומת bash או powershell. יש אתר מצויין שמתעד אותו: https://ss64.com/nt ניתן ללמוד משם הכל. אבל אין צורך להכיר את כל הפינות של השפה, מספיק להכיר מלמעלה את היכולות ואז לבדוק במקרה הצורך באתר הנ"ל. אני השתמשתי בו עבור הדוגמאות הנ"ל.

דוגמאות ב-bash:

  • אם קוד היציאה של command1 שווה 0 (כלומר הצליח) הרץ command2 אחרת הרץ command3:
if command1; then command2; else command3; fi
  • אם קוד היציאה של command1 הוא בין 10 ל-20 הרץ command2:
command1
if [[ $? -gt 10 && $? -le 20 ]]; then command2; else command3; fi
# או
if [ $? -gt 10 -a $? -le 20 ]; then command2; else command3; fi
# או
if [ $? -gt 10 ] && [ $? -le 20 ]; then command2; else command3; fi
# או
if (( $? > 10 && $? <= 20 )); then command2; else command3; fi

ℹ ב-CMD הביטוי if בוחן את התוצאה של ביטוי בוליאני (ביטוי שתוצאתה הינו true או false), ב-bash ביטוי if תמיד בוחן קוד יציאה של פקודה. יש לצורך זה כמה פקודות "מיוחדות" כמו ], ‏[[ ... ]], ‏(( ... )) ו-test. פקודות אלו מקבלות ביטוי בוליאני ומחזירים קוד יציאה של 0 במידה והתוצאה היא true וקוד יציאה של 1 במידה והתוצאה false.

⚠ למי שמכיר שפות תכנות: שימו לב, ביטוי if ב-bash עובד בדיוק הפוך מבכל שפות התכנות. קוד יציאה של 0 נחשב כהצלחת מבחן ה-if וקוד לא אפסי נחשב ככישלון.

בפוסט הבא בעז"ה נרחיב על pipes.