Save Terminal from Process Completed in Mac OSX

What’s happening

One day, when I opened up terminal as usual, it showed [Process completed] and just terminated. I could not type any thing, run any scripts and work on my project. Even worse, this made me unable to install programs into my computer because many installations need to run shell scripts. Okay, I searched over the internet and there was no solution for that. I even peaked many parts in the Mac OSX system to see if there were any mis-configuration, of course nothing helps. After all, I though if there is nothing wrong, it must be something done with my /bin/bash. And after I upgraded my bash, my lovely terminal came back!

Change shell’s default execution

The truth is, when you open terminal, it execute /bin/bash. As it is not working now, we need another environment for us to execute stuff. Open Terminal->Preference, and change Shells open with manually to /bin/sh.

Update /bin/bash

Now we are going to download the latest version of bash and replace the old one. Open up a new terminal and now you are able to execute commands. Copy and paste the following codes into the terminal, they will automatically handle everything for you.

curl -LO ftp://ftp.cwru.edu/pub/bash/bash-4.2.tar.gz  
tar zxvf bash-4.2.tar.gz  
cd bash-4.2  
./configure && make && sudo make install  
chsh -s /usr/local/bin/bash {user_name}  
sudo bash -c "echo /usr/local/bin/bash >> /private/etc/shells"  
cd /bin  
sudo mv bash bash-old  
sudo ln -s /usr/local/bin/bash bash  

Once done

Go to Terminal->Preference again and change Shells open with back to Default login shell. Enjoy!

What I did?

Okay, I admit that I did something to the system sometimes ago. I was doing some experiments on sandboxing and played with “chroot jail” stuff before. That is, I need to create an environment with restricted support to the program I run. So I wrote a sandbox, configured it’s root to a ‘secure’ place (anywhere not the actual root), and copy essential executables to that new root. Well, so far I think I didn’t do anything harm to the system, but I might corrupt the /bin/bash when I copied it to the sandbox root.

Diagnosis

Shell will run the following files before letting user to do anything. Check everyone to see if there are any misconfigurations.

  • ~/.bash_profile (for /bin/bash)
  • ~/.profile (for /bin/sh)
  • /etc/profile (for /bin/sh)
  • /etc/bashrc (for /bin/bash)
  • (google for more)

To play with, add some echoes to see if they works. Btw, I love nano more than vi, so try out sudo nano /etc/bashrc.

Another thing

The code above updates your bash to version 4.2. To check if there is any new version, go to the ftp.

Reference