I felt comfortable using bash shell on MacOS. But Catalina replaced it with zsh.
Why? Can I switch it back?
If so, how?
Does it make sense to do so? Any gotchas?
Install desired bash: brew install bash
Confirm the path: /opt/homebrew/bin/bash --version (If it's different, adapt the below accordingly).
sudo nano /etc/shells and insert /opt/homebrew/bin/bash at the top of the list. This is so the next instruction will succeed.
Change default login shell: chsh -s /opt/homebrew/bin/bash
Close and reopen your terminal program, and echo $SHELL to confirm the running shell is indeed /opt/homebrew/bin/bash
Now tweak so a terminal session can see homebrew locations: nano ~/.bash_profile (it will create it if it's empty) and add the line:
eval "$(/opt/homebrew/bin/brew shellenv)"
> echo $SHELL
/opt/homebrew/bin/bash # location of the running shell program
> echo $BASH_VERSION # version of the running shell program
5.2.15(1)-release
> which bash # check our $PATH contains homebrew locations
/opt/homebrew/bin/bash
> bash --version # check this is consistent with above
GNU bash, version 5.2.15(1)-release (aarch64-apple-darwin22.1.0)
Copyright (C) 2022 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.
MacOS ships with the latest BASH that uses LGPL v2 license:
> which bash
/bin/bash
> /bin/bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23)
Copyright (C) 2007 Free Software Foundation, Inc.
You can install latest bash (e.g. with homebrew)
> brew install bash
:
> brew info bash
==> bash: stable 5.2.15 (bottled), HEAD
:
What happened here? AFAIK after 3.2.x, the bash license changed from LGPL v2 to v3. Apple refused to morph into compliance LGPL v3, instead fixing the bash version shipping with MacOS to 3.2.x. Eventually it became awkward, and (2019/Catalina) they switched to zsh (MIT license).
Now we need to use chsh to change the default login shell to the new bash, but first we'll need to locate the executable.
NOTE: Annoyingly,
> brew --prefix bash
/opt/homebrew/opt/bash
... is a wild goose chase as you'd rabbithole into how homebrew stores packages (.../Cellar), symlinks to the latest version (.../opt) and exposes relevant binaries (.../bin). So let's not go there for now.
Here are the PATHs homebrew requires.
> brew shellenv
export HOMEBREW_PREFIX="/opt/homebrew";
export HOMEBREW_CELLAR="/opt/homebrew/Cellar";
export HOMEBREW_REPOSITORY="/opt/homebrew";
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}";
export MANPATH="/opt/homebrew/share/man${MANPATH+:$MANPATH}:";
export INFOPATH="/opt/homebrew/share/info:${INFOPATH:-}";
Let's add these paths into the current shell session and locate the executable:
> which bash
/bin/bash
> bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23)
Copyright (C) 2007 Free Software Foundation, Inc.
> eval "$(brew shellenv)"
> which bash
/opt/homebrew/bin/bash
> bash --version
GNU bash, version 5.2.15(1)-release (aarch64-apple-darwin22.1.0)
Copyright (C) 2022 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.
Now we'll use chsh to change the default login shell to /opt/homebrew/bin/bash.
chsh will only accept a shell listed in /etc/shells, so edit that file and insert the line (e.g. with sudo nano /etc/shells.
Now you should see:
> cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/opt/homebrew/bin/bash
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
Now chsh will work:
chsh -s /opt/homebrew/bin/bash
Close and reopen your terminal program. Now:
> echo $SHELL
/opt/homebrew/bin/bash
> echo $BASH_VERSION
5.2.15(1)-release
... to confirm it worked.
However there's one remaining gotcha:
which bash
/bin/bash
This is because those homebrew PATHs we listed earlier aren't added to our shell session anywhere.
To fix, edit (creating if necessary) ~/.bash_profile and add the line:
eval "$(/opt/homebrew/bin/brew shellenv)"
Now restart your terminal program and both echo $SHELL and which bash should now be in alignment. More importantly, your shell now has visibility over homebrew locations.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With