MacOS comes with bash 3 as the default shell program; Apple doesn't want to upgrade to the later versions for intellectual property reasons. This means that some features of later versions of bash, like associative arrays, are not available with the default shell. You can always install later versions yourself, however.
Setting up my Mac to run a different version of bash in the terminal was surprisingly hard for me to figure out how to do; it's a pretty straightforward process but I didn't see any one resource describing the entire thing from start to finish, so I'm doing it here.
This is based on my own experience installing bash 5.0.16, using Homebrew 2.2.7, on MacOS Mojave 10.14.6. If this doesn't work for you, let me know in the comments (including the versions of bash, Homebrew, and MacOS), and what if anything did end up working. I'd love to make it applicable to more people.
Prerequisites
This tutorial assumes some basic familiarity using the terminal on Mac.
You should have the Homebrew package manager installed -- see this article for instructions.
There's some basic editing with vim -- this article contains everything you need here, but it's basically just knowing i
for "insert" and esc
+ :wq
+ return
to save changes.
Check your current version
Verify that you have the old version installed currently:
$ echo $BASH_VERSION
3.2.57(1)-release
Install the latest bash version using Homebrew
Use $ brew install bash
to install the latest version (or specify a version). Take note of where in the filesystem the cask is located, you'll see a message like this:
==> Pouring bash-5.0.16.mojave.bottle.tar.gz
🍺 /usr/local/Cellar/bash/5.0.16: 150 files, 9.4MB
Take a look at that folder:
$ ls /usr/local/Cellar/bash/5.0.16
AUTHORS NEWS changelog
CHANGES NOTES include
COPYING README lib
INSTALL_RECEIPT.json bin share
$ ls /usr/local/Cellar/bash/5.0.16/bin
bash bashbug
The full path to the shell we want is (in this case) /usr/local/Cellar/bash/5.0.16/bin/bash
. Make a note of it for the next step.
Set the default shell
There are two steps to changing this. First, find the "shells" file and edit it:
$ atom /etc/shells # or whatever your preferred text editor is
Add the full path (in this case /usr/local/Cellar/bash/5.0.16/bin/bash
) to the end of the list of shells, then save and quit. This will tell your computer that it is safe to use that shell (it's a safety measure to prevent people from accidentally setting random programs as their default shell and breaking everything).
Back in your command line, use the "change shell" command:
$ chsh
Changing shell for <user>.
Password for <user>:
Enter your password. You'll then get file like this in Vim:
# Changing user information for <user>.
# Use "passwd" to change the password.
##
# Open Directory: /Local/Default
##
Shell: /bin/bash
Full Name:
Office Location:
Office Phone:
Home Phone:
~
~
Change the entry after "shell" to the new shell path, then save and exit.
Check installation
You may need to open a new terminal window or tab for this to work.
$ echo $BASH_VERSION
5.0.16(1)-release
🥳 Yay! 🥳 You can now use new features from bash 4 and 5. And you can always put the default shell back using chsh
if you want.
Top comments (4)
For what it's worth, you can set
/usr/local/bin/bash
in/etc/shells
then use that path so that if you upgrade bash to a new release you don't have to bother with updated/etc/shells
and changing your user's shell.Seems to have changed along the way with
brew
. Now use this for the/etc/shells
entry -/opt/homebrew/bin/bash
.The path changed for M1 Macs. It's still /usr/local/bin/bash on Intel Macs.
Really good stuff, thank you! =)