Výchozí bash v macOS je stále bash v3:

$ bash --versionGNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)Copyright (C) 2007 Free Software Foundation, Inc.

Před nedávnem byl vydán bash v5. Rozdíl vychází z toho, že bash je od verze 4 licencován jako GPL v3. Apple nástroje s licencí GPL v3 k systému MacOS nepřikládá.

Nic vám však nebrání stáhnout si a nainstalovat nejnovější verzi bash.

Nové funkce zahrnují mimo jiné přidružená pole (tj. slovníky) a lepší nastavení automatického dokončování.

Ačkoli by se zdálo, že je to běžné přání, většina stránek, které jsem našel, prostě odkazuje na Homebrew, kde si stáhnete a nainstalujete novější verzi bashe.

Hlavním problémem při používání brew je, že nefunguje v rozsahu, který MacAdmins vyžadují. brew je určen pro instalaci jedním uživatelem, který má práva správce. Pracovní postupy brew nejsou škálovatelné pro rozsáhlá nasazení řízená systémem správy.

Pravděpodobně by existoval instalátor balíčků pro nejnovější verzi bashe. Projekt bash bohužel žádný neposkytuje.

V tomto příspěvku ukážu, jak můžete nainstalovat nejnovější verzi bashe bez brew a jak sestavit instalační balíček pro nasazení.

Ruční instalace

To vyžaduje instalaci Xcode nebo nástrojů příkazového řádku pro vývojáře.

Nejprve si stáhněte zdrojový kód nejnovější verze bashe z této stránky. V době psaní tohoto článku je nejnovější verze bash-5.0 a soubor, který chcete, je bash-5.0.tar.gz. Po stažení můžete archiv rozbalit ve Finderu dvojitým kliknutím.

Aktualizace: Mám tu příspěvek s aktualizovanými pokyny, které zahrnují záplaty pro bash 5.0.

Otevřete okno Terminálu a změňte adresář na nově rozbalený adresář bash-5.0. Pak tam spusťte skript configure.

$ cd ~/Downloads/bash-5.0$ ./configure

Proces konfigurace bude chvíli trvat, bude tam spousta hlášení ukazujících průběh.

Po dokončení procesu configure. Můžete sestavit bash pomocí příkazu make.

$ make

Tím se sestaví binární soubor bash a podpůrné soubory v aktuálním adresáři. Tam to nakonec nechceme, ale je asi dobré zjistit, zda proces sestavování funguje. To bude (opět) chvíli trvat. Objeví se nějaká podivně vypadající varování, ale ta můžete ignorovat.

Když se make podaří, můžete skutečně nainstalovat bash v5 pomocí

$ sudo make install

Tím se sestaví a nainstaluje binárka bash a podpůrné soubory do /usr/local/bin a /usr/local. K úpravě /usr/local je zapotřebí sudo.

Pokud jste právě hledali způsob, jak nainstalovat bash v5 bez brew, máte hotovo!

Ve zbytku příspěvku jsou však další užitečné informace, takže čtěte dál!

Jak spolu nový a starý bash spolupracují

Ve výchozím nastavení se binárka bash v5 jmenuje bash a bude nainstalována do /usr/local/bin. Ve výchozím nastavení systému macOS PATH je /usr/local/bin uveden před /bin, kde je umístěna výchozí binárka bash v3, která se také jmenuje bash.

To znamená, že když uživatel zadá do shellu bash, bude upřednostněna verze v /usr/local/bin před předinstalovaným bash v3.

Toto chování si můžete vyzkoušet v Terminálu. Protože výchozí shell ještě nebyl změněn z /bin/bash, Terminál se stále otevře na bash v3. Můžete to otestovat tak, že zobrazíte proměnnou prostředí BASH_VERSION:

$ echo $BASH_VERSION3.2.57(1)-release

Ale když pak spustíte bash, vyvolá se /usr/local/bin/bash, takže se spustí nový bash v5. Zobrazí se to ve výzvě, ale můžete také ověřit BASH_VERSION.

$ bashbash-5.0$ echo $BASH_VERSION5.0.0(2)-release

To může být nastavení, které chcete, když chcete vždy používat bash v5. U některých uživatelů to však může vést k neočekávanému chování.

Jednou z možností, jak se této nejednoznačnosti vyhnout, je přejmenovat binárku v /usr/local/bin na bash5. Pak ale jiné nástroje, například env (zmíněný níže), již binárku nenajdou.

  • Skriptování OS X:

    bash v5 a skriptování

    Skripty používající bash, by měly mít celou cestu k binárce v shebang. Autor skriptu tak může ovlivnit, zda bude skript spuštěn výchozím bashem v3 (/bin/bash) nebo novějším bashem v5 (/usr/local/bin/bash nebo /usr/local/bin/bash5).

    Často se doporučuje používat v shebangu příkaz env:

    #!/usr/bin/env bash

    Příkaz env určí cestu k binárce bash v aktuálním prostředí. (tj. pomocí aktuálního PATH) To je užitečné, pokud má skript běžet v různých prostředích, kde není známo umístění binárky bash, jinými slovy na více unixových a unixům podobných platformách. Tím se však skutečná verze bash, která bude interpretovat skript, stává nepředvídatelnou.

    Předpokládejme například, že máte nainstalovaný bash v5 ve výchozí konfiguraci (jako /usr/local/bin/bash. Skript se shebangem #!/usr/bin/env bash spuštěný v uživatelském prostředí (tj. z Terminálu) použije novější bash, protože /usr/local/bin je v pořadí vyhledávání před /bin.

    Pokud stejný skript spustíte v jiném kontextu, např. jako instalační skript, AppleScript nebo systém správy, /usr/local/bin pravděpodobně nebude v tomto prostředí součástí PATH. Pak bude šém env volit /bin/bash (v3). Skript bude interpretován a může se chovat jinak.

    Správci dávají přednost jistotě ve svých spravovaných prostředích. Správci by měli znát umístění a verze binárních souborů ve svých systémech. U skriptů pro správu byste se měli vyhnout env a použít správnou úplnou cestu k požadovanému binárnímu interpretu.

    Řešení pro vyřešení nejednoznačnosti je

    • použít úplnou cestu k binárce v shebang
    • spravovat a aktualizovat další vlastní verzi bash s a. systému správy
    • (volitelné) přejmenujte novější binární verzi bash na bash5 nebo bash4 (to vám také umožní mít v jednom systému k dispozici bash v4 a bash v5)
    • Skriptování OS X: Na Shebang
    • Scripting OS X: Cesta k výchozímu shellu uživatele je uložena v záznamu uživatele: Nastavení PATH ve skriptech

    Změna výchozího shellu uživatele na bash v5

    I když jsme nainstalovali bash v5, výchozí shell nového okna Terminálu bude stále používat vestavěný bash v3.

    Cesta k výchozímu shellu je uložena v záznamu uživatele. Atribut UserShell můžete změnit přímo pomocí dscl, v „Rozšířených možnostech“ panelu předvoleb „Uživatelé & Skupiny“ nebo v nástroji Directory Utility.

    Existuje také příkaz pro nastavení výchozího shellu:

    $ chsh -s /usr/local/bin/bashChanging shell for armin.Password for armin: chsh: /usr/local/bin/bash: non-standard shell

    Příkaz chsh (change shell) zkontroluje povolené shelly v souboru /etc/shells. Do tohoto souboru můžete snadno přidat řádek s /usr/local/bin/bash, a pak bude chsh fungovat bez problémů.

    $ chsh -s /usr/local/bin/bashChanging shell for armin.Password for armin: 

    Poznámka: pokud se rozhodnete přejmenovat binární soubor bash, musíte použít změněný název v /etc/shells a pomocí chsh.

    Pamatujte, že pouhé spuštění chsh nezmění shell v aktuálním okně Terminálu. Nejlepší je zavřít staré okno Terminálu a otevřít nové, abyste získali nový shell.

    Balení bash v5 pro hromadné nasazení

    Ačkoli jsou tyto kroky pro instalaci a konfiguraci bash v5 na jednom Macu dostatečně jednoduché, nefungovaly by dobře v případě systému správy stovek nebo tisíců Maců. Chceme všechny soubory, které make install vytvoří, zabalit do užitečného zatížení instalačního balíčku.

    Volba --help skriptu configure poskytuje tuto užitečnou informaci:

    Ve výchozím nastavení je 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`.

    Pokud spustíme skript configure s volbou --prefix, vytvoří složku vhodnou jako náklad pro instalátor balíčků. Pomocí pkgbuild pak můžeme sestavit a vytvořit instalační soubor pkg:

    $ 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

    (Poznámka: argument --prefix vyžaduje absolutní cestu.)

    Automatické vytvoření balíčku

    Máme tedy náš pracovní postup pro sestavení instalačního balíčku pro distribuci a konfiguraci bash v5:

    • stažení archivu
    • rozbalení archivu
    • spuštění configure s argumentem --prefix
    • spuštění make install pro vytvoření souborů ve složce payload
    • volitelné: přejmenujte výslednou binárku bash na bash5, abyste se vyhnuli konfliktům
    • přidejte skript postinstall, který přidá /usr/local/bin/bash do /etc/shells, pokud tam ještě není
    • vyrobte instalátor pomocí pkgbuild

    To zní jako pracovní postup zralý pro automatizaci. Skript můžete získat z tohoto úložiště.

    Jako argument skriptu můžete předat jiné (platné) číslo verze bashe, například 4.4.18. (Nic výrazně staršího jsem netestoval.) Skript automaticky nezjišťuje nejnovější verzi a pokud není zadán žádný argument, je výchozí verzí 5.0. Až bude zveřejněna aktualizace na bash v5, budete muset řádek s verzí upravit nebo skript spustit s argumentem.

    Nepodařilo se mi (zatím) přijít na to, jak zjistit nejnovější verzi z webové stránky pro stažení. autopkg Předpis na to bude muset počkat. (Pokud se toho chce ujmout někdo jiný, prosím!)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.