Az alapértelmezett bash
macOS-en még mindig a bash v3:
$ bash --versionGNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)Copyright (C) 2007 Free Software Foundation, Inc.
Nemrég megjelent a bash v5. Az eltérés abból adódik, hogy a bash
a 4-es verzió óta GPL v3 licenc alatt áll. Az Apple nem mellékel GPL v3 licencű eszközöket a macOS-hez.
Mindenesetre semmi sem tart vissza attól, hogy letöltsd és telepítsd a legújabb bash
verziót.
Az új funkciók közé tartozik többek között a kapcsolódó tömbök (pl. szótárak) és a jobb automatikus kitöltés beállítása.
Míg azt gondolnánk, hogy ez egy általános kívánság, a legtöbb oldal, amit találtam, egyszerűen a Homebrew-ra mutat, hogy töltsön le és telepítsen egy újabb bash verziót.
A brew
használatával kapcsolatos fő kihívás az, hogy nem működik olyan mértékben, ahogy a MacAdminok igénylik. A brew
egyfelhasználós telepítésre készült, ahol a felhasználó rendszergazdai jogosultságokkal rendelkezik. A brew
munkafolyamatai nem skálázódnak nagy telepítésekhez, amelyeket egy kezelőrendszerrel irányítanak.
Igazából lenne csomagtelepítő a legújabb bash verzióhoz. Sajnos a bash projekt nem biztosít ilyet.
Ebben a bejegyzésben megmutatom, hogyan telepítheti a legújabb bash verziót brew
nélkül, és hogyan készíthet telepítőcsomagot a telepítéshez.
Kézi telepítés
Ez Xcode vagy a Developer Command Line Tools telepítését igényli.
Először töltse le a legújabb bash verzió forrását erről az oldalról. Jelen cikk írásakor a legfrissebb verzió bash-5.0
, a kívánt fájl pedig bash-5.0.tar.gz
. Miután letöltötted, a Finderben dupla kattintással kibővítheted az archívumot.
Frissítés: Van egy bejegyzésem néhány frissített utasítással, amely tartalmazza a bash 5.0-hoz készült javításokat.
Nyiss egy Terminal ablakot, és válts könyvtárat az újonnan kibővített bash-5.0
könyvtárba. Ezután futtasd ott a configure
szkriptet.
$ cd ~/Downloads/bash-5.0$ ./configure
A configure folyamat eltart egy darabig, rengeteg üzenet fogja mutatni a haladást.
Mihelyt a configure
folyamat befejeződött. A make
paranccsal megépíthetjük a bash
-et.
$ make
Ez a bash
bináris állományt és a támogató fájlokat az aktuális könyvtárba építi. Végül nem oda akarjuk, ahova akarjuk, de valószínűleg jó ötlet megnézni, hogy működik-e a build folyamat. Ez (ismét) eltart egy darabig. Lesz néhány furcsán kinéző figyelmeztetés, de ezeket figyelmen kívül hagyhatjuk.
Ha a make
sikerül, akkor ténylegesen telepíthetjük a bash
v5-öt a
$ sudo make install
Ez a bash
binárisát és a támogató fájlokat a /usr/local/bin
és /usr/local
könyvtárakba építi és telepíti. A /usr/local
módosításához a sudo
szükséges.
Ha csak a bash
v5 telepítésének módját kerested brew
nélkül, akkor kész!
A poszt további részében azonban több hasznos információ is található, úgyhogy olvass tovább!
Hogy az új és a régi bash kölcsönhatásba lép egymással
Egyértelmezés szerint a bash v5 binárisának neve bash
, és a /usr/local/bin
-be lesz telepítve. A macOS alapértelmezett PATH
a /usr/local/bin
-t a /bin
elé sorolja, ahol az alapértelmezett bash v3 bináris található, szintén bash
néven.
Ez azt jelenti, hogy amikor a felhasználó bash
-t ír be egy shellbe, a /usr/local/bin
-ben lévő verziót fogja előnyben részesíteni az előre telepített bash v3-mal szemben.
Ezt a viselkedést a Terminalban tesztelheti. Mivel az alapértelmezett héj még nem változott a /bin/bash
-ről, a Terminál továbbra is a bash v3-ra nyílik meg. Ezt a BASH_VERSION
környezeti változó megjelenítésével tesztelheted:
$ echo $BASH_VERSION3.2.57(1)-release
De amikor ezután a bash
-t futtatod, akkor meghívja a /usr/local/bin/bash
-t, tehát az új bash v5-öt fogja futtatni. Ezt mutatja a promptban, de ellenőrizheted a BASH_VERSION
-t is.
$ bashbash-5.0$ echo $BASH_VERSION5.0.0(2)-release
Ez lehet a kívánt beállítás, ha mindig a bash v5-öt akarod használni. Néhány felhasználó számára azonban váratlan viselkedéshez vezethet.
Egy lehetőség ennek a kétértelműségnek az elkerülésére, hogy a /usr/local/bin
-ben lévő bináris állományt átnevezzük bash5
-ra. Ekkor azonban más eszközök, például az alább említett env
már nem fogja megtalálni a bináris állományt.
- Scripting OS X:
Figyelem: a PATH
más kontextusokban valószínűleg nem fogja tartalmazni a /usr/local/bin
-et, és tovább zavarja a dolgokat.
bash v5 és Scripting
A bash
-t használó szkripteknek a shebangben a bináris teljes elérési útját kell tartalmazniuk. Így a szkript szerzője szabályozhatja, hogy a szkriptet az alapértelmezett bash v3 (/bin/bash
) vagy az újabb bash v5 (/usr/local/bin/bash
vagy /usr/local/bin/bash5
) futtassa-e.
A shebangben gyakran ajánlott a env
parancs használata:
#!/usr/bin/env bash
A env
parancs meghatározza a bash
bináris elérési útját az aktuális környezetben. (azaz az aktuális PATH
segítségével) Ez akkor hasznos, ha a szkriptet különböző környezetekben kell futtatni, ahol a bash bináris helye ismeretlen, más szóval több Unix és Unix-szerű platformon keresztül. Ez azonban kiszámíthatatlanná teszi a szkriptet értelmező bash
tényleges verzióját.
Tegyük fel például, hogy a bash v5 van telepítve az alapértelmezett konfigurációban (mint /usr/local/bin/bash
. A felhasználói környezetben (azaz a Terminálból) indított #!/usr/bin/env bash
shebanggel rendelkező szkript az újabb bash
-et fogja használni, mivel a /usr/local/bin
a /bin
előtt van a keresési sorrendben.
Ha ugyanazt a szkriptet más környezetben indítja el, például telepítő szkriptként, AppleScriptként vagy egy kezelőrendszerben, a /usr/local/bin
valószínűleg nem lesz része a PATH
-nek abban a környezetben. Ekkor a env
shebang a /bin/bash
-et (v3) fogja választani. A szkript értelmezésre kerül, és esetleg másképp viselkedik.
A rendszergazdák a biztonságot részesítik előnyben a kezelt környezetükben. A rendszergazdáknak ismerniük kell a binárisok helyét és verzióit a rendszereiken. A kezelési szkriptek esetében kerülje a env
-t, és használja a megfelelő teljes elérési utat a kívánt értelmező binárisához.
A kétértelműség feloldására szolgáló megoldások:
- használja a bináris teljes elérési útját a shebangben
- kezelje és frissítse a
bash
további egyéni verzióját abash
. kezelőrendszerrel - (opcionális) nevezze át az újabb
bash
bináris verziótbash5
vagybash4
-re (ez lehetővé teszi azt is, hogy abash
v4 és abash
v5 ugyanazon a rendszeren elérhető legyen) - Szerkesztés OS X: A Shebang
- Scripting OS X: A PATH beállítása a szkriptekben
A felhasználó alapértelmezett shelljének bash v5-re történő módosítása
Még ha telepítettük is a bash v5-öt, egy új Terminal ablak alapértelmezett shellje továbbra is a beépített bash v3-at fogja használni.
Az alapértelmezett shell elérési útvonalát a felhasználói rekordban tároljuk. A UserShell
attribútumot közvetlenül megváltoztathatjuk a dscl
segítségével, a ‘Felhasználók & Csoportok’ beállítási ablak ‘Speciális beállítások’ menüpontjában vagy a Könyvtár segédprogramban.
Az alapértelmezett héj beállítására is van egy parancs:
$ chsh -s /usr/local/bin/bashChanging shell for armin.Password for armin: chsh: /usr/local/bin/bash: non-standard shell
A chsh
(héj módosítása) parancs a /etc/shells
fájlban ellenőrzi az engedélyezett héjakat. Ebbe a fájlba könnyen beilleszthetsz egy /usr/local/bin/bash
sort, és akkor a chsh
működni fog.
$ chsh -s /usr/local/bin/bashChanging shell for armin.Password for armin:
Figyelem: ha úgy döntesz, hogy átnevezed a bash
bináris fájlt, akkor a /etc/shells
-ben és a chsh
-vel a megváltozott nevet kell használnod.
Ne feledd, hogy a chsh
egyszerű futtatása nem fogja megváltoztatni a héjat az aktuális Terminal ablakban. A legjobb, ha bezárjuk a régi Terminal ablakot, és megnyitunk egy újat, hogy megkapjuk az új héjat.
A bash v5 csomagolása tömeges telepítéshez
Míg ezek a lépések a bash v5 telepítéséhez és konfigurálásához egyetlen Mac-en elég egyszerűek, nem működnének jól egy több száz vagy ezer Mac-et kezelő rendszerben. Az összes fájlt, amelyet a make install
létrehoz, egy csomagtelepítő hasznos terhébe akarjuk csomagolni.
A configure
szkript --help
opciója ezt a hasznos információt adja:
Egyértelmezés szerint
make install' will install all the files in
/usr/local/bin,
/usr/local/libetc. You can specify an installation prefix other than
/usr/localusing
-prefix, for instance
-prefix=$HOME`.
Ha a configure szkriptet a --prefix
opcióval futtatjuk, akkor létrehoz egy olyan mappát, amely alkalmas egy csomagtelepítő program számára fizetőeszközként. Ezután használhatjuk a pkgbuild
build-et a telepítő pkg létrehozásához:
$ cd ~/Downloads/bash-5.0$ mkdir payload$ ./configure --prefix=/Users/armin/Downloads/bash-5.0/payload$ make install$ pkgbuild --root payload --install-location /usr/local --identifier org.gnu.bash --version 5.0 bash-5.0.pkgpkgbuild: Inferring bundle components from contents of payloadpkgbuild: Wrote package to bash-5.0.pkg
(Megjegyzés: a --prefix
argumentumhoz abszolút elérési útvonalra van szükség.)
A csomag létrehozásának automatizálása
Megvan tehát a munkafolyamatunk a bash v5 terjesztéséhez és konfigurálásához szükséges telepítőcsomag létrehozásához:
- az archívum letöltése
- az archívum kicsomagolása
- a
configure
futtatása a--prefix
argumentummal - a
make install
futtatása a fájlok létrehozásához egy payload mappában - opcionális: Az így kapott
bash
bináris állományt nevezzük átbash5
-ra a konfliktusok elkerülése érdekében - Adjunk hozzá egy
postinstall
szkriptet, amely hozzáadja a/usr/local/bin/bash
-t a/etc/shells
-hez, ha még nincs meg - építsük a telepítőt a
pkgbuild
Ez úgy hangzik, mint egy automatizálásra érett munkafolyamat. A szkriptet erről az adattárról szerezheted be.
Egy másik (érvényes) bash verziószámot is átadhatsz argumentumként a szkriptnek, pl. 4.4.18
. (Jelentősen régebbit nem teszteltem.) A szkript nem érzékeli automatikusan a legújabb verziót, és alapértelmezés szerint a 5.0
verziót használja, ha nem adunk meg argumentumot. Ha megjelenik a bash v5 frissítése, akkor módosítani kell a verzió sort, vagy a szkriptet egy argumentummal kell futtatni.
Nem jöttem rá (még), hogyan lehet a letöltési weboldalról felismerni a legújabb verziót. Egy autopkg
receptre még várni kell. (Ha valaki más szeretne ezzel foglalkozni, kérem, tegye meg!)