[Tutoriel] Installer la dernière version de Bash sur macOS (Catalina, Big Sur)
Depuis macOS Catalina, Apple a remplacé Bash par Zsh comme Shell par défaut. Il y a donc de fortes chances que le Shell que vous utilisez sur votre Mac soit Zsh, et bien que ce dernier soit très proche de Bash, quelques fonctionnalités diffèrent.
Q: Pourquoi ne suffit-il pas d’utiliser la version native dans
/bin/bash?
À l’heure où je rédige cet article, la version stable la plus récente de Bash est la 5.1, or, si vous exécutez la commande:
bash --versionVous obtenez le résultat suivant:
GNU bash, version 3.2.57(1)-release (x86_64-apple darwin19)
Copyright (C) 2007 Free Software Foundation, IncComme vous pouvez le voir, la version installée nativement est la 3.2, qui date de 2007 ! La raison pour laquelle Apple n’a pas mis à jour celle-ci est que la version suivante (la 4.0) est passée sous licence GPLv3 incompatible avec la politique d’Apple qui veut signer son propre code.
Bien heureusement, il est possible d’installer une version plus récente, alors passons au concret.
1. Installation de Brew
Si vous ne l’avez pas déjà installé, Homebrew est le gestionnaire de paquets le plus utilisé dans l’Univers Mac, il vous sera de toute manière utile dans votre vie de dev… alors pour l’installer il suffit d’exécuter la commande:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"2. Installer la dernière version de Bash
On va maintenant installer le paquet Bash depuis Brew, en exécutant la commande:
brew install bashUne fois l’installation terminée, on peut explorer les localisations des deux versions, si cette exploration ne vous intéresse pas, vous pouvez directement passer à l’étape 3 du tutoriel.
On peut se servir de la commande which avec son option -a pour vérifier qu’on a maintenant deux versions de Bash installées:
which -a bash
/usr/local/bin/bash
/bin/bashOn peut ensuite vérifier la version de chacun des deux programmes, en premier, la version nouvellement installée avec Brew:
/usr/local/bin/bash --versionLe résultat vous confirme que c’est bien la version 5.1 (ou ultérieure) qui a été installée:
GNU bash, version 5.1.4(1)-release (x86_64-apple-darwin20.2.0)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Ensuite, on va faire le même test pour la version native macOS de Bash:
/bin/bash --versionQui nous renvoie le même résultat que tout au début de ce tutoriel:
GNU bash, version 3.2.57(1)-release (x86_64-apple darwin19)
Copyright (C) 2007 Free Software Foundation, IncVu que la nouvelle version dans /usr/local/bin vient par défaut avant l’ancienne dans /bin dans $PATH la version qui sera utilisée lorsque nous saisissons simplement bash sera la nouvelle:
bash --version
GNU bash, version 5.1.4(1)-release (x86_64-apple-darwin20.2.0)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
3. Autoriser la nouvelle version à la connexion
Dans les systèmes UNIX une protection permet de restreindre les Shell pouvant être utilisés comme des Login Shells. Pour autoriser notre nouvelle version de Bash, il faudra rajouter ce dernier dans le fichier listant les Shells autorisés /etc/shells, pour ce faire on va d’abord ouvrir ce fichier avec les droits sudo:
sudo nano /etc/shellsOn y rajoute le Shell /usr/local/bin/bash :
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/bashOn n’oublie pas d’enregistrer le fichier et ce sera bon pour cette étape.
4. Définir le Shell par défaut
Il suffit d’exécuter la commande suivante:
chsh -s /usr/local/bin/bashCette commande change le Shell par défaut pour l’utilisateur l’ayant exécutée, il faudra donc l’exécuter également en tant que sudo:
sudo chsh -s /usr/local/bin/bash5. Utiliser le bon Shebang
Cette solution implique que nos scripts Bash doivent utiliser comme Shebang #!/usr/local/bin/bash alors que #!/bin/bash est presque un standard.
Je vous recommande de privilégier la version portable des Shebang:
#!/usr/bin/env bashCette version inspecte le PATH pour utiliser le bash par défaut, et fera en sorte que vos scripts soient plus portables.
En Bonus, garder uniquement la version récente
Le tutoriel présenté conserve inutilement l’ancienne version dans /bin/bash, pour rester compatible avec le SIP (System Integrity Protection d’Apple) qui consiste à interdire l’accès en modification à certains dossiers (y compris en root) dont /bin concerné ici, en installant la nouvelle version dans /usr/local/bin non concerné par la protection.
Bien heureusement, nous pouvons désactiver cette protection (en tant qu’informaticiens adultes qui savent ce qu’ils font), mais pour cela il faudra aller un peu plus loin dans nos manipulations:
Note: je vous suggère de conserver une copie des étapes ci-dessous dans un endroit séparé puisqu’on va devoir redémarrer notre machine dans un mode n’ayant pas de navigateur internet.
- Démarrer votre machine en mode
Recovery OSen redémarrant votre mac puis en restant appuyé simultanément surcommandetRau démarrage; - Attendre que l’OS démarre puis ouvrir l’application
Terminaldepuis le menuUtilities; - Saisir la commande:
csrutil enable - Fermer l’application
Terminalest redémarrer la machine (normalement). Le SIP est maintenant désactivé.
Maintenant que SIP est désactivé, nous allons pouvoir supprimer l’ancienne version de Bash est la remplacer par un lien symbolique vers la nouvelle:
sudo rm /bin/bash
sudo ln -s /usr/local/bin/bash /bin/bashEnjoy!
—
Ref: https://apple.stackexchange.com/questions/193411/update-bash-to-version-4-0-on-osx/292760#292760
