[Tutoriel] Installer la dernière version de Bash sur macOS (Catalina, Big Sur)

Ilyas Toumlilt
4 min readFeb 25, 2021
Le logo officiel de Bash

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 --version

Vous obtenez le résultat suivant:

GNU bash, version 3.2.57(1)-release (x86_64-apple darwin19)
Copyright (C) 2007 Free Software Foundation, Inc

Comme 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 bash

Une 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/bash

On peut ensuite vérifier la version de chacun des deux programmes, en premier, la version nouvellement installée avec Brew:

/usr/local/bin/bash --version

Le 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 --version

Qui 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, Inc

Vu 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/shells

On 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/bash

On 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/bash

Cette 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/bash

5. 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 bash

Cette 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.

  1. Démarrer votre machine en mode Recovery OS en redémarrant votre mac puis en restant appuyé simultanément sur command et R au démarrage;
  2. Attendre que l’OS démarre puis ouvrir l’application Terminal depuis le menu Utilities;
  3. Saisir la commande: csrutil enable
  4. Fermer l’application Terminal est 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/bash

Enjoy!


Ref: https://apple.stackexchange.com/questions/193411/update-bash-to-version-4-0-on-osx/292760#292760

--

--

Ilyas Toumlilt

CS PhD, Distributed and Operating Systems Engineer — Track & Field Athlete — www.toumlilt.com