Standard bash på macOS er stadig bash v3:

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

For nylig blev bash v5 udgivet. Diskrepansen kommer af, at bash har været licenseret som GPL v3 siden version 4. Apple inkluderer ikke GPL v3-licenserede værktøjer med macOS.

Der er dog intet, der forhindrer dig i at downloade og installere den nyeste bash-version.

Nye funktioner omfatter blandt mange andre ting tilknyttede arrays (dvs. ordbøger) og bedre opsætning af autokomplettering.

Mens man skulle tro, at dette er et almindeligt ønske, vil de fleste sider, jeg har fundet, blot henvise til Homebrew for at hente og installere en nyere bash-version.

Den største udfordring ved at bruge brew er, at det ikke virker i den skala, som MacAdmins kræver. brew er designet til installation af en enkelt bruger, hvor brugeren har administratorrettigheder. brews arbejdsgange skalerer ikke til store implementeringer, der styres med et administrationssystem.

Det ville være ideelt set være pakkeinstallationsprogram til den nyeste bash-version. Desværre leverer bash-projektet ikke en sådan.

I dette indlæg vil jeg vise, hvordan du kan installere den nyeste bash-version uden brew, og hvordan du opbygger en installationspakke til udrulning.

Manuel installation

Dette kræver, at Xcode eller Developer Command Line Tools er installeret.

Først skal du downloade kilden til den nyeste bash-version fra denne side. I skrivende stund er den seneste version bash-5.0, og den ønskede fil er bash-5.0.tar.gz. Når den er downloadet, kan du udvide arkivet i Finder ved at dobbeltklikke.

Opdatering: Jeg har et indlæg med nogle opdaterede instruktioner for at inkludere patches til bash 5.0.

Åbn et Terminal-vindue, og skift mappe til den nyligt udvidede bash-5.0-mappe. Kør derefter configure-scriptet der.

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

Konfigureringsprocessen vil tage et stykke tid, der vil være masser af meddelelser, der viser fremskridt.

Når configure-processen er afsluttet. Du kan bygge bash med kommandoen make.

$ make

Dette vil bygge bash binærfilen og de understøttende filer i den aktuelle mappe. Det er ikke der, vi ønsker det i sidste ende, men det er nok en god idé at se, om byggeprocessen fungerer. Dette vil (igen) tage et stykke tid. Der vil være nogle mærkeligt udseende advarsler, men dem kan du ignorere.

Når make lykkes, kan du faktisk installere bash v5 med

$ sudo make install

Dette vil bygge og installere bash binærfilen og de understøttende filer i /usr/local/bin og /usr/local. sudo er påkrævet for at ændre /usr/local.

Hvis du bare ledte efter en måde at installere bash v5 uden brew, er du færdig!

Der er dog flere nyttige oplysninger i resten af indlægget, så læs videre!

Hvordan den nye og den gamle bash interagerer

Som standard hedder bash v5-binæren bash og vil blive installeret i /usr/local/bin. MacOS-standard PATH angiver /usr/local/bin før /bin, hvor standardbash v3-binærfilen, der også hedder bash, er placeret.

Det betyder, at når en bruger skriver bash i en shell, vil versionen i /usr/local/bin blive foretrukket frem for den forudinstallerede bash v3.

Du kan teste denne adfærd i Terminal. Da standardskallen endnu ikke er blevet ændret fra /bin/bash, åbnes Terminal stadig til bash v3. Du kan teste dette ved at vise BASH_VERSION miljøvariablen:

$ echo $BASH_VERSION3.2.57(1)-release

Men når du derefter kører bash vil den påkalde /usr/local/bin/bash, så den vil køre den nye bash v5. Den vil vise dette i prompten, men du kan også verificere BASH_VERSION.

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

Dette er måske den opsætning, du ønsker, når du altid vil bruge bash v5. Det kan dog føre til en uventet adfærd for nogle brugere.

En mulighed for at undgå denne tvetydighed er at omdøbe binærfilen i /usr/local/bin til bash5. Men så vil andre værktøjer som env (nævnt nedenfor) ikke finde den binære fil længere.

  • Scripting OS X: Hvor PATHs kommer fra

Bemærk: PATH i andre sammenhænge vil sandsynligvis ikke indeholde /usr/local/bin og forvirre tingene yderligere.

bash v5 og Scripting

Skripter, der bruger bash, bør have den fulde sti til binærfilen i shebang. På denne måde kan scriptforfatteren kontrollere, om et script udføres af standard bash v3 (/bin/bash) eller den nyere bash v5 (/usr/local/bin/bash eller /usr/local/bin/bash5).

Det anbefales ofte at bruge kommandoen env i shebang:

#!/usr/bin/env bash

Kommandoen env bestemmer stien til bash binærfilen i det aktuelle miljø. (dvs. ved hjælp af den aktuelle PATH) Dette er nyttigt, når scriptet skal køre i forskellige miljøer, hvor placeringen af bash-binærfilen er ukendt, med andre ord på tværs af flere Unix- og Unix-lignende platforme. Dette gør dog den faktiske version af bash, som vil fortolke scriptet, uforudsigelig.

Fors eksempel antager vi, at du har bash v5 installeret i standardkonfigurationen (som /usr/local/bin/bash. Et script med shebang #!/usr/bin/env bash lanceret i brugermiljøet (dvs. fra Terminal) vil bruge den nyere bash, da /usr/local/bin kommer før /bin i søgeordenen.

Når du starter det samme script i en anden kontekst, f.eks. som et installationsscript, et AppleScript eller et administrationssystem, vil /usr/local/bin sandsynligvis ikke være en del af PATH i det pågældende miljø. Så vil env shebang’en vælge /bin/bash (v3). Scriptet vil blive fortolket og vil muligvis opføre sig anderledes.

Administratorer foretrækker sikkerhed i deres administrerede miljøer. Administratorer bør kende placeringen og versionerne af binære filer på deres systemer. For administrationsscripts bør du undgå env og bruge den korrekte fulde sti til den ønskede binære fortolkerbinary.

Løsningerne til at løse tvetydigheden er

  • brug den fulde sti til binærfilen i shebang
  • håndter og opdater den ekstra brugerdefinerede version af bash med en administrationssystem
  • (valgfrit) omdøbe den nyere binære bash til bash5 eller bash4 (dette giver dig også mulighed for at have bash v4 og bash v5 til rådighed på samme system)
  • Scripting OS X: På Shebang
  • Scripting OS X: Indstilling af PATH i scripts

Ændring af en brugers standardskal til bash v5

Selv om vi har installeret bash v5, vil standardskallen i et nyt Terminal-vindue stadig bruge den indbyggede bash v3.

Stien til standardskallen er gemt i brugeroptegnelsen. Du kan ændre UserShell-attributten direkte med dscl, i ‘Avancerede indstillinger’ i indstillingsruden ‘Brugere & Grupper’ eller i Directory Utility.

Der findes også en kommando til at indstille standardskal:

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

Kommandoen chsh (change shell) kontrollerer, om der er tilladte skaller i /etc/shells-filen. Du kan nemt tilføje en linje med /usr/local/bin/bash til denne fil, og så vil chsh fungere fint.

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

Bemærk: Hvis du vælger at omdøbe den binære bash, skal du bruge det ændrede navn i /etc/shells og med chsh.

Husk, at det at køre chsh alene ikke ændrer skallen i det aktuelle Terminal-vindue. Det er bedst at lukke det gamle Terminal-vindue og åbne et nyt for at få den nye shell.

Pakning af bash v5 til masseudrulning

Mens disse trin til at installere og konfigurere bash v5 på en enkelt Mac er enkle nok, ville de ikke fungere godt med et administrationssystem til hundredvis eller tusindvis af Macs. Vi ønsker at pakke alle de filer, som make install opretter, ind i en payload til pakkeinstallationsprogrammet.

Optionen --help i configure-scriptet giver disse nyttige oplysninger:

Som standard er 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`.

Når vi kører configure-scriptet med indstillingen --prefix, opretter det en mappe, der er egnet som en nyttelast for et pakkeinstallationsprogram. Vi kan derefter bruge pkgbuild til at bygge for at oprette et installationsprogram 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

(Bemærk: --prefix-argumentet kræver en absolut sti.)

Automatisér oprettelsen af pakken

Så har vi vores arbejdsgang til opbygning af en installationspakke til distribution og konfiguration af bash v5:

  • henter arkivet
  • udpakker arkivet
  • kører configure med --prefix-argumentet
  • kører make install for at oprette filerne i en payload-mappe
  • optionelt: omdøbe den resulterende bash binære fil til bash5 for at undgå konflikter
  • tilføj et postinstall script, der tilføjer /usr/local/bin/bash til /etc/shells, hvis det endnu ikke er til stede
  • opbyg installationsprogrammet med pkgbuild

Det lyder som en arbejdsgang, der er moden til automatisering. Du kan hente scriptet fra dette repository.

Du kan give et andet (gyldigt) bash-versionnummer som et argument til scriptet, f.eks. 4.4.18. (Jeg testede ikke noget, der var væsentligt ældre.) Scriptet registrerer ikke automatisk den nyeste version, og det indstilles som standard til version 5.0, når der ikke er angivet noget argument. Når der offentliggøres en opdatering til bash v5, skal du ændre versionslinjen eller køre scriptet med et argument.

Jeg har (endnu) ikke fundet ud af, hvordan jeg kan registrere den nyeste version fra download-websiden. En autopkg opskrift bliver nødt til at vente på det. (Hvis en anden har lyst til at tage fat på det, så gør det endelig!)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.