Shell Creation
Whenever you invoke a command that is not built
into the shell, a new shell process is created which inherits many
of the properties of its parent. However, variables and aliases are not
inherited unless they are exported. Type ``export
''
and you will see what's been exported by the initialisation files.
Typing
she=janet ; he=john ; export she
(`;' is a statement separator) creates 2 new variables, only one of which is exported. They can be printed out using
echo $she $he
Now type ``bash''. This will put you into a new shell, a child of the original.
echo $she $he
will only print out one name, the one you exported. If you type ``ps -f'' you will get an output something like
UID PID PPID C STIME TTY TIME CMD tpl 6006 31173 0 14:03 pts/3 00:00:00 bash tpl 6027 6006 0 14:03 pts/3 00:00:00 ps -f tpl 31173 31172 0 09:01 pts/3 00:00:00 -bash
Notice that you are running 2 bash processes. The PPID
column gives
the PID
of the parent process so you can see that the 2nd shell
was started from within the 1st. You can kill this new shell
by typing exit
. More interestingly, you can suspend the
shell by typing <CTRL> Z
and fall back into the original shell. Convince yourself that
this is so by trying the `echo' and `ps' commands again, or
`jobs', then return to the child shell by typing `fg'
(foreground).
You won't often need to jump around like this but it's useful to
be aware of the mechanism, especially since it helps elucidate
some problems regarding scope and lifetimes of variables.
When you run a script by typing its name, a new process is started up. If the script contains a cd command or changes the value of an environmental variable, only the new process will be affected - the original shell's environment and current directory won't have been 'overwritten'. If however you type 'source scriptname' then the commands in the script are run in the original process. This is called sourcing the script.
You can force shell script commands to run in a new process by using brackets. For example, if you type ``cd / ; ls'' you will be left in the root directory, but if you type ``(cd / ; ls)'' you'll end up where you began because the cd command was run in a new, temporary, process.