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árcebash
v aktuálním prostředí. (tj. pomocí aktuálníhoPATH
) 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á verzebash
, 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 šémenv
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
nabash5
nebobash4
(to vám také umožní mít v jednom systému k dispozicibash
v4 abash
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 budechsh
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
skriptuconfigure
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
nabash5
, 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!)