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 uudelleen bash5:ksi tai bash4:ksi (näin voit myös pitää bash v4:n ja bash 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 uudelleen bash5: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ä!)

Vastaa

Sähköpostiosoitettasi ei julkaista.