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. brew
s 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
tilbash5
ellerbash4
(dette giver dig også mulighed for at havebash
v4 ogbash
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 tilbash5
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!)