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 a bash. kezelőrendszerrel
  • (opcionális) nevezze át az újabb bash bináris verziót bash5 vagy bash4-re (ez lehetővé teszi azt is, hogy a bash v4 és a bash 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 át bash5-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!)

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.