38

I updated unsuccessfully my Bash to 3.2.48 by MacPorts.

It seems that I do not have it active, since I get

echo $BASH_VERSION
3.2.17(1)-release

How can you make the newest Bash active such that I get it for my login shell?

Léo Léopold Hertz 준영
  • 134,464
  • 179
  • 445
  • 697

3 Answers3

75

Run the following code, for instance to change your shell to the newest Bash installed by MacPorts

chsh -s /opt/local/bin/bash

If that gives you the message,

"non-standard shell"

you will need to add

/opt/local/bin/bash

to

/etc/shells

Note that /etc/shells is just a text file, so you can edit it directly if you authenticate as root. You can programmatically change it by the command

sudo -s
Password:
# echo /opt/local/bin/bash >> /etc/shells

If your first chsh command failed, run it now again if you managed to change the above file.

Nicholas Riley
  • 43,532
  • 6
  • 101
  • 124
  • If you encounter problems running the port application, you may additionally need to update your bash profiles. See http://superuser.com/a/366645/114131 for more information. – Florian Feldhaus Dec 30 '12 at 12:06
  • Note that one might need to reorder the entries in `/etc/shells` such that the new `bash` location precedes other ones, for everything to work properly. – DilithiumMatrix Jun 13 '13 at 17:19
  • @zhermes: Not true. Order in /etc/shells has no effect on anything. – Noldorin Dec 09 '13 at 22:50
  • @Noldorin changing the order fixed the problem for me. That's all I can say. – DilithiumMatrix Dec 10 '13 at 02:22
  • Okay, I believe you. :) Maybe you did not specify the full path when using chsh then... odd though. It's non-standard behaviour; maybe your system is borked. – Noldorin Dec 10 '13 at 02:33
2

You can switch your login shell, from your existing Mac OS X login shell (by default its /bin/bash shipped with Mac OS X), to MacPorts /opt/local/bin/bash just by using the following shell script:

#!/opt/local/bin/bash
if [ `grep /opt/local/bin/bash /etc/shells` ]; 
then 
    echo /opt/local/bin/bash | chsh -s /opt/local/bin/bash;     
else 
    echo /opt/local/bin/bash | sudo tee -a /etc/shells; 
    chsh -s /opt/local/bin/bash; 
fi
Uwe Günther
  • 2,971
  • 2
  • 21
  • 26
  • 2
    Do not test the output of grep, test its exit status. `if grep -Fxq /opt/local/bin/bash /etc/shells; then` – geirha Aug 19 '14 at 06:47
2

I'm guessing it's installed but not being used as your login shell.

You can change the shell using dscl on the command line.

At the dscl prompt type the following:

list Local/Default/Users
read Local/Default/Users/<your username here>
change Local/Default/Users/<your username here> UserShell /bin/bash /opt/local/bin/bash

I have another example of dscl use on my blog if it helps.

segy
  • 644
  • 4
  • 12
  • 1
    First you have to add the new shell to /etc/shells: # sudo echo /opt/local/bin/bash >> /etc/shells – Fa11enAngel Nov 01 '10 at 09:24
  • 2
    change Local/Default/Users/simpatico UserShell /bin/bash /opt/local/bin/bash
    attribute status: eDSAttributeNotFound DS Error: -14134 (eDSAttributeNotFound)
    – simpatico Mar 29 '11 at 13:39