באש

**באש** (באנגלית: **Bash**) היא מעטפת פקודה למערכות יוניקס, ולמערכות דמויות יוניקס (לדוגמה: גנו/לינוקס) מאת פרויקט גנו. המעטפת פותחה בשנת 1989 על ידי בריאן פוקס, בניצוחו של ריצ'רד סטולמן, כמיזם תוכנה חופשית וכתחליף ל-Bourne Shell, עבור פרויקט גנו. ברוב מערכות גנו/לינוקס, מופצת באש כברירת מחדל ומהווה בסיס חיוני למערכת (יחד עם כלים בסיסיים נוספים, גם כן מבית גנו).

## מקור שם התוכנה
שם המעטפת נגזר משם המעטפת Bourne shell שהופצה לראשונה בגרסה 7 של מערכת ההפעלה UNIX בשנת 1979. משמעות השם **Bash** היא ראשי תיבות של **Bourne-again shell**, כמשחק מילים על Bourne Shell. שם המעטפת בתרגום לעברית: "מעטפת (פקודה) שנולדה מחדש"

## מאפיינים טכניים

### שיפורים לעומת גרסאות קודמות
תחביר הפקודות של באש הוא הרחבה של Bourne Shell ומציע מספר שיפורים לעומתו. בין השיפורים: עריכת פקודות, הסרת ההגבלה על גודל הזיכרון המוקצה לשמירת היסטוריות הפקודות שבוצעו דרך המעטפת, שליטה בתהליכי משתמש (jobs), כתיבת פונקציות, יצירת קיצורי שם לפקודות מורכבות (aliases), עבודה עם מערכים ללא הגבלת גודל, ביצוע חישובים אריתמטיים מבסיס 2 עד 64, שמירה לזיכרון מחסנית של מסלולים בעץ הקבצים (מנגנון pushd/popd), תמיכה במערכים אסוציאטיביים (מערכים שהגישה אליהם אינה בעזרת אינדקס מספרי; החל מגרסה 4).

### ממשקיות עם מערכות הפעלה נוספות
המעטפת מופצת גם עם מערכת Mac OS X מבית אפל. ניתן להריץ את המעטפת גם על מערכת ההפעלה Windows מבית מיקרוסופט בעזרת Cygwin, אך המעטפת לא מיועדת לכך. בשנת 2016 מיקרוסופט הוציאה פתרון להרצת המעטפת במערכת ההפעלה Windows 10 באמצעות כלי ייעודי מתוצרתה שפותח ביחד עם קנוניקל, מפיצת Ubuntu. חברת גוגל פיתחה Google Cloud Shell מבוססת דביאן.

## Bash Scripting
בדומה לכל מעטפת פקודה סטנדרטית, גם התחביר של באש מאפשר יצירה של קובצי אצווה. קבצים אלה נקראים Bash Scripts ולהם צורה מובנית כפי שמדגים הסקריפט הבא:


```bash
#!/bin/bash
 
#this line is just a plain comment and will be ignored by the executing shell.
if [ $# -lt 3 ] ; then
        echo "I expected at least 3 positional parameters for this script"
        exit 1
fi
#loop over all input arguments and print them in order
for x in $* ; do
        echo "the next argument is ${x}"
done
#loop over all input argument and print them in order
#but also shift them such that the second argument becomes the first one, etc.
while [ $# -gt 0 ] ; do
        echo "the next argument is ${1}"
        shift
done
# done, exit script with success code 0.
exit 0
```


* שורות הערה יחלו בתו #, למעט השורה הראשונה של הקובץ המתחילה ב- !#. שורה זו מציינת לליבת מערכת הפעלה באיזו מעטפת יש להריץ את הפקודות המופיעות בקובץ.
* החלק הראשון של הסקריפט מכיל קטע התניה מהצורה  if [...] ; then ... fi, שבודק את מספר הארגומנטים שהועברו לסקריפט משורת הפקודה בעזרת בחינה של המשתנה השמור #$. משתנה זה מציין את מספר הפרמטרים שמועברים לסקריפט
* lt- הוא אופרטור השוואה המחזיר ערך אמת או שקר בהתאם לכך שהאופרנד השמאלי קטן מן האופרנד הימני. במקרה הזה נבדק שנשלחו לפחות שלושה פרמטרים משורת הפקודה. במידה ואין זה כך, מבוצע גוף הקטע המותנה שבו מודפסת הודעה בחזרה למעטפת בעזרת פקודת echo והסקריפט מסתיים בקוד שגיאה 1 בעזרת הפקודה exit 1.
* אם הקלט נמצא תקין, ממשיך הסקריפט לביצוע קטע לולאה מהצורה for x in list ; do ... done שבמקרה זה עובר על רשימת הפרמטרים שהועברו לסקריפט דרך שורת הפקודה (בעזרת בחינה של תוכן המשתנה השמור *$) והדפסתם למעטפת על פי סדר הופעתם.
* הלולאה האחרונה שנראית בדוגמה מציגה שימוש בלולאה מותנית להדפסה ובה נבחן מספר הפרמטרים על ידי גישה למשתנה השמור #$ נוכח ביצוע פקודת shift בגוף הלולאה. הפקודה הנ"ל מבצעת הזזה של הפרמטרים שמועברים לסקריפט מימין לשמאל, במקום אחד בכל פעם.
* בתום הסקריפט מוחזר ערך הצלחה 0 בעזרת הפקודה exit 0.

## ראו גם
* Shellshock

## קישורים חיצוניים

* 
* Advanced Bash Scripting Guide (אנגלית) מתוך פרויקט התיעוד של לינוקס
* מדריך מקוון ל Bash

## הערות שוליים

קטגוריה:שפות תכנות
קטגוריה:יוניקס
קטגוריה:תוכנות שהושקו ב-1989
קטגוריה:ממשקי שורת פקודה
קטגוריה:תוכנות הכתובות ב-C