Default bash
macOS:llä on edelleen bash v3:
$ bash --versionGNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)Copyright (C) 2007 Free Software Foundation, Inc.
Juuri äskettäin julkaistiin bash v5. Epäjohdonmukaisuus johtuu siitä, että bash
on ollut GPL v3-lisensoitu versiosta 4 lähtien. Apple ei toimita GPL v3 -lisensoituja työkaluja macOS:n mukana.
Mikään ei kuitenkaan estä sinua lataamasta ja asentamasta uusinta bash
-versiota.
Uusiin ominaisuuksiin kuuluvat muun muassa assosioituneet matriisit (eli sanakirjat) ja paremmat automaattisen täydennyksen asetukset.
Vaikka luulisi, että tämä on yleinen toive, useimmat löytämäni sivut vain osoittavat Homebrew:n lataamaan ja asentamaan uudemman bash-version.
Haasteena brew
:n käyttämisessä on lähinnä se, että se ei toimi siinä mittakaavassa, jota MacAdminit vaativat. brew
on suunniteltu yhden käyttäjän asennukseen, jossa käyttäjällä on järjestelmänvalvojan oikeudet. brew
:n työnkulut eivät skaalaudu suuriin käyttöönottoihin, joita hallitaan hallintajärjestelmällä.
Todennäköisesti olisi olemassa pakettiasentaja uusinta bash-versiota varten. Valitettavasti bash-projekti ei tarjoa sellaista.
Tässä postauksessa näytän, miten voit asentaa uusimman bash-version ilman brew
ja miten rakennat asennuspaketin käyttöönottoa varten.
Käsinasennus
Tämä vaatii Xcoden tai kehittäjän komentorivityökalujen asentamisen.
Lataa ensin viimeisimmän bash-version lähdekoodi tältä sivulta. Tätä kirjoitettaessa uusin versio on bash-5.0
ja haluamasi tiedosto on bash-5.0.tar.gz
. Kun olet ladannut sen, voit laajentaa arkistoa Finderissa kaksoisnapsauttamalla.
Päivitys: Minulla on viesti, jossa on päivitetyt ohjeet bash 5.0:n korjausten sisällyttämiseksi.
Avaa terminaali-ikkuna ja vaihda hakemisto juuri laajennettuun hakemistoon bash-5.0
. Suorita sitten siellä configure
-skripti.
$ cd ~/Downloads/bash-5.0$ ./configure
Konfigurointiprosessi kestää jonkin aikaa, tulee runsaasti viestejä, jotka osoittavat edistymistä.
Kun configure
-prosessi on valmis. Voit rakentaa bash
komennolla make
.
$ make
Tämä rakentaa bash
binäärin ja sitä tukevat tiedostot nykyiseen hakemistoon. Se ei ole siellä, minne haluamme sen loppujen lopuksi, mutta on luultavasti hyvä idea nähdä, toimiiko build-prosessi. Tämä kestää (taas) jonkin aikaa. Tulee joitain oudon näköisiä varoituksia, mutta voit jättää ne huomiotta.
Kun make
onnistuu, voit itse asiassa asentaa bash
v5:n komennolla
$ sudo make install
Tällöin rakennetaan ja asennetaan bash
-binääri ja tukitiedostot /usr/local/bin
:een ja /usr/local
:een. sudo
tarvitaan /usr/local
:n muokkaamiseen.
Jos etsit vain tapaa asentaa bash
v5 ilman brew
, olet valmis!
Loppupuolella postausta on kuitenkin enemmän hyödyllistä tietoa, joten jatka lukemista!
Miten uusi ja vanha bash ovat vuorovaikutuksessa keskenään
Oletusarvona on, että bash v5:n binäärin nimi on bash
, ja se asentuu /usr/local/bin
:een. MacOS:n oletusarvo PATH
listaa /usr/local/bin
ennen /bin
, jossa oletuksena oleva bash v3 -binary, jonka nimi on myös bash
, sijaitsee.
Tämä tarkoittaa, että kun käyttäjä kirjoittaa bash
komentotulkkiin, /usr/local/bin
:ssä olevaa versiota pidetään parempana kuin esiasennettua bash v3:a.
Voit testata tätä käyttäytymistä Terminalissa. Koska oletuskomentotulkkia ei ole vielä muutettu /bin/bash
:stä, Terminal avaa edelleen bash v3:n. Voit testata tämän näyttämällä ympäristömuuttujan BASH_VERSION
:
$ echo $BASH_VERSION3.2.57(1)-release
Mutta kun sitten suoritat bash
, se kutsuu /usr/local/bin/bash
, joten se ajaa uutta bash v5:tä. Se näyttää tämän komentokehotteessa, mutta voit myös tarkistaa BASH_VERSION
.
$ bashbash-5.0$ echo $BASH_VERSION5.0.0(2)-release
Tämä saattaa olla juuri se asetelma, jonka haluaisit, kun haluat käyttää bash v5:tä aina. Se saattaa kuitenkin johtaa odottamattomaan käyttäytymiseen joillekin käyttäjille.
Yksi vaihtoehto tämän epäselvyyden välttämiseksi on nimetä binääri uudelleen /usr/local/bin
:ssä bash5
:ksi. Mutta silloin muut työkalut, kuten env
(mainittu alla), eivät enää löydä binääritiedostoa.
- Scripting OS X: Where PATHs come from
Huomaa: PATH
muissa yhteyksissä ei todennäköisesti sisällä /usr/local/bin
ja sekoittaa asioita entisestään.
bash v5 ja Scripting
Skripteissä, jotka käyttävät bash
, pitäisi olla koko polku binääritiedostoon shebangissa. Näin skriptin kirjoittaja voi kontrolloida, suoritetaanko skripti oletusarvoisella bash v3:lla (/bin/bash
) vai uudemmalla bash v5:llä (/usr/local/bin/bash
tai /usr/local/bin/bash5
).
Tiheästi suositellaan käyttämään shebangissa komentoa env
:
#!/usr/bin/env bash
Komennolla env
määritetään nykyisessä ympäristössä oleva polku bash
-binääriin. (eli käyttämällä nykyistä PATH
) Tämä on hyödyllistä silloin, kun skripti on ajettava eri ympäristöissä, joissa bash-binäärin sijainti on tuntematon, toisin sanoen useilla Unix- ja Unixin kaltaisilla alustoilla. Tämä tekee kuitenkin skriptin tulkitsevan bash
:n todellisen version arvaamattomaksi.
Oletetaan esimerkiksi, että olet asentanut bash v5:n oletuskokoonpanoon (kuten /usr/local/bin/bash
. Käyttäjäympäristössä (eli terminaalista) käynnistetty skripti, jossa on shebang #!/usr/bin/env bash
, käyttää uudempaa bash
:tä, koska /usr/local/bin
on hakujärjestyksessä ennen /bin
:tä.
Kun käynnistät saman skriptin eri kontekstissa, esimerkiksi asennusskriptinä, AppleScriptinä tai hallintajärjestelmässä, /usr/local/bin
ei todennäköisesti ole osa PATH
:ää kyseisessä ympäristössä. Silloin env
shebang valitsee /bin/bash
(v3). Skripti tulkitaan ja se saattaa käyttäytyä eri tavalla.
Hallinnoijat haluavat varmuutta hallituissa ympäristöissään. Järjestelmänvalvojien tulisi tietää binääriohjelmien sijainti ja versiot järjestelmissään. Hallintaskripteissä kannattaa välttää env
ja käyttää oikeaa täyttä polkua haluttuun tulkin binääriin.
Ratkaisut epäselvyyksien ratkaisemiseksi ovat
- käytä täyttä polkua binääriin shebangissa
- hallitse ja päivitä ylimääräinen mukautettu versio
bash
:n kanssa. hallintajärjestelmällä - (valinnainen) nimeä uudempi
bash
-binääri uudelleenbash5
:ksi taibash4
:ksi (näin voit myös pitääbash
v4:n jabash
v5:n saatavilla samassa järjestelmässä) - Skripti OS X:lle: Shebang
- Scripting OS X: PATH:n asettaminen skripteissä
Käyttäjän oletusshellin muuttaminen bash v5:ksi
Vaikka olemme asentaneet bash v5:n, uuden terminaali-ikkunan oletusshellinä käytetään edelleen sisäänrakennettua bash v3:a.
Polku oletusshelliin on tallennettu käyttäjätietueeseen. Voit muuttaa UserShell
-attribuuttia suoraan dscl
:llä, ’Users & Groups’-esiintymäruudun ’Advanced Options’ -valintaikkunassa tai Directory Utility -apuohjelmassa.
On myös komento, jolla voit asettaa oletuskuoret:
$ chsh -s /usr/local/bin/bashChanging shell for armin.Password for armin: chsh: /usr/local/bin/bash: non-standard shell
Komento chsh
(change shell) tarkistaa sallitut kuoret /etc/shells
-tiedostosta. Voit helposti liittää tähän tiedostoon rivin /usr/local/bin/bash
, jolloin chsh
toimii hienosti.
$ chsh -s /usr/local/bin/bashChanging shell for armin.Password for armin:
Huomaa: jos päätät nimetä bash
-binäärin uudelleen, sinun on käytettävä muuttunutta nimeä /etc/shells
:ssä ja komennolla chsh
.
Muista, että pelkkä komennon chsh
suorittaminen ei muuta nykyisessä terminaali-ikkunassa olevaa komentotulkkia. On parasta sulkea vanha Terminal-ikkuna ja avata uusi, jotta saat uuden komentotulkin käyttöön.
Bash v5:n paketoiminen joukkokäyttöön
Nämä askeleet bash v5:n asentamiseksi ja konfiguroimiseksi yksittäiseen Mac-tietokoneeseen ovat riittävän yksinkertaisia, mutta ne eivät toimisi hyvin satojen tai tuhansien Mac-tietokoneiden hallintajärjestelmässä. Haluamme kietoa kaikki tiedostot, jotka make install
luo, paketin asennusohjelman hyötykuormaan.
Skriptin configure
--help
-vaihtoehto tuottaa tämän hyödyllisen tiedon:
Esimerkiksi
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`.
Kun ajamme configure-skriptin --prefix
-vaihtoehdolla, se luo kansion, joka soveltuu hyötykansioksi paketin asentajalle. Tämän jälkeen voimme käyttää pkgbuild
buildia luodaksemme asennusohjelman 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
(Huomaa: --prefix
-argumentti vaatii absoluuttisen polun.)
Automate the package creation
Siten meillä on työnkulku asennuspaketin rakentamiseen bash v5:n jakelua ja konfigurointia varten:
- lataa arkisto
- purkaa arkisto
- suorita
configure
argumentilla--prefix
- suorita
make install
luodaksesi tiedostot hyötykansioon - valinnainen: Nimeä tuloksena syntyvä
bash
binääri uudelleenbash5
:ksi ristiriitojen välttämiseksi - Lisää
postinstall
-skripti, joka lisää/usr/local/bin/bash
:n/etc/shells
:iin, jos sitä ei vielä ole - rakenna asennusohjelma
pkgbuild
:llä
:llä
:llä
Tämä kuulostaa automatisoitavalta työnkululta. Saat skriptin tästä arkistosta.
Voit antaa skriptille argumenttina eri (kelvollisen) bash-versionumeron, esim. 4.4.18
. (En testannut mitään huomattavasti vanhempaa.) Skripti ei tunnista uusinta versiota automaattisesti, vaan oletusarvona on versio 5.0
, jos argumenttia ei anneta. Kun päivitys bash v5:een julkaistaan, sinun on muutettava versioriviä tai ajettava skripti argumentin kanssa.
En ole (vielä) keksinyt, miten tunnistaa uusin versio lataussivulta. autopkg
Resepti joutuu odottamaan sitä. (Jos joku muu haluaa tarttua siihen, olkaa hyvä!)