If you give login a valid username and password
combination, it will check in /etc/passwd to see
which shell to give you. In most cases on a Linux system this
will be bash. It is bash's job to read
your commands and see that they are acted on. It is
simultaneously a user interface, and a programming language
interpreter.
As a user interface it reads your commands, and executes them
itself if they are ``internal'' commands like cd, or
finds and executes a program if they are ``external'' commands
like cp or startx. It also does groovy
stuff like keeping a command history, and completing filenames.
We have already seen bash in action as a programming
language interpreter. The scripts that init runs to
start the system up are usually shell scripts, and are executed
by bash. Having a proper programming language, along
with the usual system utilities available at the command line
makes a very powerful combination, if you know what you are
doing. For example (smug mode on) I needed to apply a whole stack
of ``patches'' to a directory of source code the other day. I was
able to do this with the following single command:
for f in /home/greg/sh-utils-1.16*.patch; do patch -p0 < $f; done;
This looks at all the files in my home directory whose names
start with sh-utils-1.16 and end with
.patch. It then takes each of these in turn, and
sets the variable f to it and executes the commands
between do and done. In this case there
were 11 patch files, but there could just as easily have been
3000.
The file /etc/profile controls the system-wide
behaviour of bash. What you put in here will affect everybody who
uses bash on your system. It will do things like add directories
to the PATH, set your MAIL directory
variable.
The default behaviour of the keyboard often leaves a lot to be
desired. It is actually readline that handles this. Readline is a
separate package that handles command line interfaces, providing
the command history and filename completion, as well as some
advanced line editing features. It is compiled into bash. By
default, readline is configured using the file
.inputrc in your home directory. The bash variable
INPUTRC can be used to override this for bash. For example in Red
Hat 6, INPUTRC is set to /etc/inputrc
in /etc/profile. This means that backspace, delete,
home and end keys work nicely for everyone.
Once bash has read the system-wide configuration file, it looks
for your personal configuration file. It checks in your home
directory for .bash_profile,
.bash_login and .profile. It runs the
first one of these it finds. If you want to change the way bash
behaves for you, without changing the way it works for others, do
it here. For example, many applications use environment variables
to control how they work. I have the variable EDITOR
set to vi so that I can use vi in Midnight Commander
(an excellent console based file manager) instead of its editor.
The basics of bash are easy to learn. But don't stop there: there is an incredible depth to it. Get into the habit of looking for better ways to do things.
Read shell scripts, look up stuff you don't understand.