bash --version (or bash -version) will NOT report the CURRENT shell’s version, but the version of the bash executable that comes FIRST IN THE $PATH.
[Note: OSX 10.10 (Yosemite) is the first OSX version where /usr/local/bin is placed BEFORE system paths such as /bin in the $PATH. Up to 10.9, system paths came first. Thus, at the time the OP asked his question, bash --version reported the SYSTEM’s bash’s version (/bin/bash), not the Homebrew-installed version (/usr/local/bin/bash)]
If you want to know the current Bash shell’s version, use:
echo $BASH_VERSION
In other words: your shell may well have been changed successfully – your test was flawed.
You can use chsh to change the current user’s shell, as follows:
[Update: Switched to using /usr/local/bin/bash rather than a specific, versioned path in /usr/local/Cellar/bash/<version>/bin/bash, as Homebrew will automatically keep the symlink at /usr/local/bin/bash pointed to the most recent installed version. Tip of the hat to @drevicko.]
# First, add the new shell to the list of allowed shells.
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
# Change to the new shell.
chsh -s /usr/local/bin/bash
Note that you’ll be prompted for your password.
Any terminal tab/window you create from that point on will already use the new shell.
Bonus tip from @bmike: If you want to replace the current shell instance with an instance of the new shell right away, run:
exec su - $USER # instantly replaces current shell with an instance of the new shell
Note that you’ll be prompted for your password again.
Alternatively, use dscl – the OSX Directory Services CLI – to change the current user’s shell; this is more cumbersome, however.
To examine the current user’s shell, use:
dscl . -read /Users/$USER UserShell # e.g. (default): 'UserShell: /bin/bash'
or, more simply, echo $SHELL, which outputs only the file path (e.g., /bin/bash).
To change the current user’s shell to, e.g., /usr/local/bin/bash, use:
sudo dscl . -change /Users/$USER UserShell /bin/bash /usr/local/bin/bash
Note:
- the penultimate argument must be the value currently in effect.
- it is NOT necessary for the new value to be contained in
/etc/shellsfor interactive use, but the comments in/etc/shellsstateFtpd will not allow users to connect who are not using one of these shells. - simply quit and restart
Terminal.app(oriTerm.app) for the change to take effect – verify the new shell withecho $BASH_VERSION– a reboot is NOT required.
Explanation of errors encountered by the OP:
chsh: /usr/local/Cellar/bash/4.2.45/bin/bash: non-standard shellimplies that/usr/local/Cellar/bash/4.2.45/bin/bashwas not – not yet, or not in this exact form – listed in/etc/shells.<main> attribute status: eDSAttributeNotFound: thisdsclerror occurs when the penultimate (next-to-last) argument specified for the-changecommand does not match the current attribute value – it is an – admittedly strange – requirement that an attribute’s current value be specified in order to change it.
While the question suggests that both conditions were met, I suspect that they weren’t met at the right times, due to experimentation.