jobbra|bélyegkép|Képernyőkép A bash unix rendszerhéj, amely a GNU Projekt részeként készült. A futtatható fájl neve bash egy játékos mozaikszó, mely a Bourne again illetve a born again kifejezéseket rövidíti. Ez a korai Bourne shell-re utal, melyet még 1978-ban adtak ki a Unix 7 Verzió részeként. A bash-t 9 évvel ezt követően 1987-ben készítette el Brian Fox, majd 1990-ben Chet Ramey vette át a szoftver gondozását.
A legtöbb Linux rendszeren, valamint az OS X rendszereken a bash az alapértelmezett shell. A Microsoft Windows platformra is átírták a Subsystem for UNIX-based Applications (SUA) használatával, vagy POSIX emuláció biztosításával a Cygwinnel, MSYS-szal.
A bash-t a GNU GPL licenc alatt publikálták, tehát szabad szoftver.
Inicializálás A bash inicializálása attól függ, hogy milyen módban indítják.
Interaktív login mód Ebben az esetben a /etc/profile script kerül először végrehajtásra, ha az létezik. Ezt követően a bash megvizsgálja a ~/.bash_profile, ~/.bash_login és a ~/.profile fájlokat ebben a sorrendben, s lefuttatja közülük az első olyat, amely létezik és olvasható.
Interaktív (nem login) mód Ha a bash interaktív nem login shellként indul, akkor a felhasználó home könyvtárában lévő .bashrc fájlt futtatja, ha az létezik.
Nem interaktív mód Ha a bash-t nem interaktívan futtatják, például shell script-ek végrehajtásához, akkor a BASH_ENV környezeti változóban megadott inicializáló script fog lefutni induláskor.
Restricted (szigorú) mód Ha a bash -t az rbash binárissal, vagy a --restricted kapcsolóval indítják, ezen mód kerül érvényre. A következő funkciók letiltásra vagy korlátozott használatra állnak be:
Könyvtárak váltása a cd paranccsal A következő környezeti változók értékeinek felülírása: SHELL, PATH, ENV, és BASH_ENV Parancsok végrehajtása, melyek nevében slash "/" karakter szerepel Fájlnév specifikálása amely slash karaktert tartalmaz a . beépített parancshoz Fájlnév specifikálása amely slash karaktert tartalmaz a beépített hash parancs `-p' opciójához Funkció definíciók importálása a shell környezetből indulás közben A SHELLOPTS változó értékének értelmezése a shell környezetből indulás közben Kimenetek átirányítása a `>', `>|', `<>', `>&', `&>', és a `>>' parancsokkal A beépített exec parancs használata a shell cseréjére Beépített parancsok hozzáadása vagy eltávolítása az `-f' és a `-d' opciókkal A `-p' opció használata bármely beépített parancshoz A szigorú mód kikapcsolása a `set +r' vagy `set +o restricted' parancsokkal
A szigorú módot sok felhasználót kiszolgáló, biztonságosra tervezett rendszerek esetén alkalmazzák.
Speciális karakterek A parancssorba írt információk egy része az utasítást végrehajtó programnak szól, más részük a programot indító bash-nek. Az utóbbiakat speciális karakterekkel jelezzük.
Új sor A legegyszerűbb speciális karakter a parancssort lezáró újsor (soremelés, LF). Hatására a bash befejezi a parancs beolvasását és elemzi a parancsot elindítja a parancsban megadott programo(ka)t megvárja, amíg az véget ér, és csak azután ad lehetőséget újabb parancs begépelésére (a prompt kiírása után). A harmadik lépés elhagyható egy másik speciális karakterrel. A parancs után írt & arra utasítja a bash-t, hogy ne várja meg a parancs lefutását (háttérben indított program; lásd még job control). Miután az indított program örökli a szülő nyitott fájljait, és a bash is tovább fut, a két program kimenete összekeveredik (hacsak a gyerekprogram nem módosítja a kapott nyitott fájlokat).
Tipikusan egy sorban egy parancs van, de lehet folytatósort írni (egy parancs több sorban), és többféle módon lehet több parancs egy sorban.
Szóhatár Az utasítás elemzésének egyik legutolsó lépése a szavakra bontás.A parancssor utasításokra bontása korábbi lépésekben történik. Az utasítás első szava a végrehajtandó parancs/program neve, a többi szót a program paraméterként kapja meg.
A szóhatárt az IFS nevű környezeti változó tartalmazza, értéke alaphelyzetben helyköz, tabulátor, új sor (LF).Így lehet kiíratni: echo -n "$IFS" | hexdump -C Több egymás utáni szóhatár-karakter egy szóhatárnak számít. (Üres szót pl. "" alakban lehet írni, lásd speciális karakter elrejtése.)
Speciális karakter elrejtése Sokszor van rá szükség, hogy a speciális karaktert a végrehajtandó parancs kapja meg, más szóval: a bash ne kezelje azt speciálisan. Ennek három módja van: a \ az őt követő egyetlen karaktert nem tekinti speciálisnak. A \-jel \\ alakban írható. ' (aposztróf): az összes speciális karaktert elrejti (kivéve a lezáró újabb '-ot) ": az összes speciális karaktert elrejti, kivéve \ (lásd feljebb) $ (hivatkozás környezeti változó vagy aritmetikai kifejezés értékére) ` (parancson belüli parancs végrehajtása; lásd backtick parancs) " (az elrejtés lezárása) Az elrejtő karakterek felváltva is használhatók. Pl. a "' szöveg a bash számára írható '"'"'", \"\', "\"'" és számos más alakban.
Speciális eset a sor végi \újsor, mely a folytatósor jele: a bash eltávolítja a parancssorból, és a következő „fizikai” sorral folytatja a parancs belolvasását.
Wildcard A wildcard olyan karakter, mely lehetővé teszi fájlnévminta megadását: *: nulla vagy több karakter a fájlnévben ?: egyetlen karakter a fájlnévben [karakterek]: a szögletes zárójelben felsorolt karakterek valamelyike. A karakterek helyén intervallum is megadható. Pl. [a-z0-9-] a kisbetűket, számjegyeket és a kötőjelet jelenti. [^karakterek] vagy [!karakterek]]: egyetlen, a szögletes zárójelben felsoroltaktól különböző karakter. A bash megkeresi a wildcard-ot tartalmazó szóra illeszkedő nem rejtett fájlokat, és ezek listáját helyközzel elválasztva a parancssorba illeszti a wildcard-os szó helyére.A bash parancssorának hossza a kerneltől függ, alaphelyzetben 128 kByte. Ha nincs ilyen fájl, nem módosít a parancssoron.
A bash számára speciális (nem wildcard) karakter a szó (fájlnév) elején álló tilde (~), melyet a bash a felhasználó saját (HOME) könyvtárára helyettesít.
A bash számára a ponttal kezdődő nevű fájlok rejtettek: a wildcard kiterjesztésekor nem kerülnek a listába, kivéve, ha a wildcard-os fájlnév ponttal kezdődik. Minden könyvtárban van két rejtett fájl: a . az aktuális, a .. a felette levő könyvtár neve. Ezek szükségesek a könyvtárszerkezetbeli navigáláshoz.
A fentiekből következik, hogy a Unix-programoknak nem kell felkészülniük a wildcard kezelésére, hiszen ezeket a shell – e szócikkben a bash – elvégzi, ráadásul egységes módon.Néhány speciális program, pl. az ls és a find saját fájlkeresést használ. Ehelyett tetszőleges számú fájlt kell tudniuk feldolgozni. A hívott program nem is tudja, hogy a fájl-paramétereit wildcard-dal vagy a fájlok felsorolásával kapta-e.
Példák wildcard-ra: *: a könyvtár összes nem rejtett fájlja *.*: legalább egy pontot tartalmazó fájlnév *\ *: legalább egy helyközt tartalmazó fájlnév (a \ jelentését lásd feljebb) [A-Z]*: nagybetűvel kezdődő fájlnév *.c: .c kiterjesztésű fájlnévUnixban nincs fájl kiterjesztés: e szó a DOS-os terminológiából származik. A pont nem különleges karakter a fájlnévben.
Környezeti változók A kernel a processz (program) adatai között nyilvántart egy memóriaterületet, melyben név=érték típusú adatok vannak. Amikor egy program elindít egy másik programot,Lásd exec rendszerhívás-családot. az indított (gyerek)program örökli a szülő éppen aktuális környezeti változóit. A másik lehetőség, hogy a szülő állítja elő a gyerekprogram környezeti változóit, és egy memóriaterületen átadja a gyerekprocesszt indító rendszerhívásban.
A bash mindig az utóbbi módon indít programot. Ez lehetővé teszi, hogy egyes környezeti változói helyiek legyenek, mások az indított program környezetébe is bekerüljenek.
A bash indulásakor már vannak környezeti változói az őt indító programtól (pl. a bejelentkezési eljárásból), és a bash többféle indító scriptje is létrehoz változókat. A bash lehetővé teszi a változók lekérdezését, módosítását, törlését, újak létrehozását.
Fontos tudni, hogy Unixban minden program – a bash is – csak a saját környezeti változóit tudja megváltoztatni, a szülőjéét nem, ui. annak csak a másolatát kapja meg.
A bash környezeti változói az env utasítással, az indított programoknak továbbadottak a set utasítással listázhatók ki. A két listában a nevek és értékek is szerepelnek.
A környezeti változó értékét a $név vagy ${név} kifejezés adja meg. A két alak egyenrangú; a másodikat akkor használjuk, ha a változót el akarjuk választani az őt követő betűtől vagy számtól (ami az első alakban összeolvadna névvel). Az értékre hivatkozást általában idézőjelbe teszünk, bár ez nem mindig szükséges. Az értéket a echo "$név" utasítás írja a képernyőre. Nem hiba értéket nem kapott változót használni; ennek értéke üres string.
Új helyi változót létrehozni, vagy a meglevőt módosítani a név=érték utasítással lehet. Az egyenlőségjel előtt és után nem lehet helyköz. Az értékben szerepelhet a változó régi értéke.
Ha azt szeretnénk, hogy a változót az indított programok is lássák, az export név utasítást használjuk. A név után az érték is megadható.
Változó az unset név utasítással törölhető.
A legfontosabb környezeti változók HOME: a bejelentkezett felhasználó saját könyvtára. IFS: szóhatár. PATH: könyvtárak kettősponttal elválasztott listája. Itt keresi a kernel az indítandó programot, ha annak útvonala nincs megadva. Az aktuális könyvtár a Dos/Windows rendszerektől eltérően alaphelyzetben nincs a PATH-ban, és biztonsági okból nem is tanácsos betenni, különösen a mindenható root felhasználó esetén. PS1, PS2, PS3, PS4: a prompt szövegét megadó változók (normál prompt, folytatósor prompt, a select utasítás promtja, debug prompt). SHELL: a shell neve; e szócikkben /bin/bash.
Példák A PATH kibővítése a felhasználó könyvtárának bin alkönyvtárával: export PATH=$PATH:$HOME/bin Ugyanez leírható export PATH+=:$HOME/bin alakban is.
Átirányítás Amikor Unixban egy program elindít egy másikat, a gyerekprogram – a környezeten kívül – a nyitott fájlokat is örökli. A felhasználó bejelentkezési procedúrája során több program is lefut, és ennek során létrejön három nyitott fájl azon az eszközön (terminálon, soros vonalon, stb.), ahonnan a felhasználó bejelentkezett, így a felhasználó login shellje ezeket már megnyitva kapja. A fájlok a megnyitás sorrendjében kapnak számot a kerneltől: 0: standard input 1: standard output 2: standard hiba. Az átirányítás célja a, hogy az indított program ne a bash-től örökölje a fenti fájlokat, hanem a parancssorban megadott fájlokat kapja meg. A három fájl egymástól függetlenül irányítható át.
A standard input átirányítása Az egyik mód az indított program standard inputjának megadása: program <fájl A másik mód shell scriptben használatos: az indított program az indító scriptből vegye a standard inputot: program <<szó program stdin-jének első sora második sor ... szó A „fájlt” lezáró szó a sor elején kell legyen. Ha a hívott program végigolvassa az standard inputját, a záró szó helyett fájl végét kap. Ha nem olvassa végig, a következő utasítás előtt a bash átugorja a be nem olvasott részt.
A kimenetek átirányítása A standard kimenet átirányítása: program >fájl program >>fájl Mindkét alak létrehozza fájl-t, ha az nem létezett a parancs kiadásakor. Az első a létező fájl tartalmát törli, de a jogait nem változtatja. A második a fájl vége után írja program kimenetét.
Fontos tudni, hogy az átirányítás a program indítása előtt történik (lásd alább). Az első alakban fájl tartalma akkor is megsemmisül, ha a hívott program nem is létezik.
A standard hiba átirányítása teljesen hasonló: program 2>fájl program 2>>fájl A bash standard kimenetére &1, a hibakimenetre &2 alakban hivatkozhatunk.Ha a bash-ben további fájlokat nyitottunk meg, azok fájlszáma is írható ilyen alakban.
Egy program mindkét kimenete ugyanabba fájlba irányítható: program >fájl 2>&1