Guide to Unix/Explanations/Choice of Shell
Choice of shell
All Unix shells are similar, but they have different features. If you are beginning, and you are not aware of the differences between shells, then you probably want to start with a Bourne-compatible, POSIX-compatible shell such as bash or ksh.
These are the Bourne-compatible shells:
- sh is the original Bourne shell. On many non-Linux systems, this is an old shell without the POSIX features. Thus bash and ksh (or even csh and tcsh) are better choices than sh. On some systems though, sh is really the same as bash or ksh.
- bash is the GNU Bourne-again shell. It is mostly Bourne-compatible, mostly POSIX-compatible, and has other useful extensions. It is the default on most Linux systems. If it is not the default, it is probably installed on Linux, and can also be installed on non-Linux systems.
- ksh is one of the three:
- Public domain ksh (pdksh) is Bourne-compatible  and mostly POSIX-compatible.
- AT&T ksh was a commercial shell. It has all of the features of pdksh, plus the ksh93 version has several interesting extensions, different from bash. It is licensed under an opensource license since 2005; Mac OS X 10.4 includes it.
- mksh is the MirBSD enhanced version of the Public Domain Korn shell (pdksh)
- dash is a POSIX compliant shell that is much smaller than bash.
BSD introduced the C shell, which sometimes resembles slightly the C programming language. This shell is csh. The shell tcsh is csh with more features. These shells are NOT Bourne-compatible. Many of the features were later added to the Bourne-compatible shells (except old copies of sh). When these features work differently in C shell and Bourne-compatible shells, this guide will describe the Bourne-compatible shells.
If csh or tcsh is your default shell, you might benefit by using bash or ksh to get Bourne-compatibility and POSIX features. Some users still prefer the C shell.
There are alternative shells such as zsh, the Z shell. The Z shell boasts extra and unusual features that make it the preferred shell of many. (For example, it has a builtin ftp client!) Though the Z shell is almost Bourne-compatible, it differs in enough ways that its default behaivour is not Bourne-compatible, though zsh is capable of masquerading as a Bourne shell when so instructed. It can also emulate ksh.
Temporarily using a different shell
If you do not like the shell that you are using, you might want to use a different shell such as ksh or bash. Shells are normal programs, and can be run easily. The SHELL environment variable will still contain the default shell. The exit command will return you to the first shell.
tcsh> printenv SHELL /bin/tcsh tcsh> bash bash$ printenv SHELL /bin/tcsh bash$ exit exit tcsh>
Permanently changing the default shell
Find list of shells by looking at /etc/shells (which can be done by executing more /etc/shells). The command
passwd -e, on some systems chsh will prompt for a new shell. To change from bash to tcsh one can simply execute chsh which will query the user to enter the absolute path to a new shell:
$ chsh Password: Changing the login shell for baldur Enter the new value, or press ENTER for the default Login Shell [/bin/bash]: /bin/tcsh
or the user can specify the shell:
$ chsh -s /bin/tcsh Password:
The shell must be specified using its absolute path, which may be found using which tcsh.
Advanced Bourne shell topics
There are some important features in the Bourne-compatible shell. This guide does not describe them because the Wikibook for Bourne Shell Scripting already has several useful chapters:
- Bourne Shell Scripting/Redirection describes redirection and piping. With redirection, one can connect the standard input and output of commands to files. With piping, one can connect commands into useful chains. This is one of the main strengths of Unix. If you only read one chapter, read this one.
- Bourne Shell Scripting/Substitution shows how the special character $ allows one to embed the values of parameters or the results of commands into the arguments of commands.
- Bourne Shell Scripting/Loops has a useful section on "for loops" which allow the same commands to run repeatedly with different arguments each time.
- pdksh Version 5.2.9 http://www.cs.mun.ca/~michael/pdksh/NEWS "can compile as sh again (--enable-shell=sh)."