In FreeBSD, a lot of everyday work is done in a command line interface called a shell.
A shell's main job is to take commands from the input channel and execute them. A lot of
shells also have built in functions to help with everyday tasks such as file management,
file globbing, command line editing, command macros, and environment variables. FreeBSD
comes with a set of shells, such as sh, the Bourne Shell, and
tcsh, the improved C-shell. Many other shells are available from
the FreeBSD Ports Collection, such as zsh and bash.
Which shell do you use? It is really a matter of taste. If you are a C programmer you
might feel more comfortable with a C-like shell such as tcsh. If
you have come from Linux or are new to a UNIX® command
line interface you might try bash. The point is that each shell
has unique properties that may or may not work with your preferred working environment,
and that you have a choice of what shell to use.
One common feature in a shell is filename completion. Given the typing of the first
few letters of a command or filename, you can usually have the shell automatically
complete the rest of the command or filename by hitting the Tab key
on the keyboard. Here is an example. Suppose you have two files called foobar and foo.bar. You want to delete
foo.bar. So what you would type on the keyboard is: rm fo[Tab].[Tab].
The shell would print out rm foo[BEEP].bar.
The [BEEP] is the console bell, which is the shell telling me it was unable to totally
complete the filename because there is more than one match. Both foobar and foo.bar start with fo, but it was able to complete to foo. If
you type in ., then hit Tab again, the
shell would be able to fill in the rest of the filename for you.
Another feature of the shell is the use of environment variables. Environment
variables are a variable/key pair stored in the shell's environment space. This space can
be read by any program invoked by the shell, and thus contains a lot of program
configuration. Here is a list of common environment variables and what they mean:
Setting an environment variable differs somewhat from shell to shell. For example, in
the C-Style shells such as tcsh and csh, you would use setenv to set
environment variables. Under Bourne shells such as sh and bash, you would use export to set your
current environment variables. For example, to set or modify the EDITOR environment variable, under csh or tcsh a command like this would set EDITOR to
/usr/local/bin/emacs:
% setenv EDITOR /usr/local/bin/emacs
Under Bourne shells:
% export EDITOR="/usr/local/bin/emacs"
You can also make most shells expand the environment variable by placing a $ character in front of it on the command line. For example, echo $TERM would print out whatever $TERM is
set to, because the shell expands $TERM and passes it on to echo.
Shells treat a lot of special characters, called meta-characters as special
representations of data. The most common one is the * character,
which represents any number of characters in a filename. These special meta-characters
can be used to do filename globbing. For example, typing in echo
* is almost the same as typing in ls because the shell
takes all the files that match * and puts them on the command
line for echo to see.
To prevent the shell from interpreting these special characters, they can be escaped
from the shell by putting a backslash (\) character in front of
them. echo $TERM prints whatever your terminal is set to. echo \$TERM prints $TERM as is.
The easiest way to change your shell is to use the chsh
command. Running chsh will place you into the editor that is in
your EDITOR environment variable; if it is not set, you will be
placed in vi. Change the “Shell:” line
accordingly.
You can also give chsh the -s
option; this will set your shell for you, without requiring you to enter an editor. For
example, if you wanted to change your shell to bash, the
following should do the trick:
% chsh -s /usr/local/bin/bash
Note: The shell that you wish to use must be present in the /etc/shells
file. If you have installed a shell from the ports collection,
then this should have been done for you already. If you installed the shell by hand, you
must do this.
For example, if you installed bash by hand and placed it into
/usr/local/bin, you would want to:
# echo "/usr/local/bin/bash" >> /etc/shells
Then rerun chsh.