|
Chapter 38 Starting, Stopping, and Killing Processes
|
|
In UNIX, when a program starts another program
(more exactly, when a process starts another process),
the new process runs as a
subprocess (38.3
)
or child process.
[1]
When a shell starts another shell, the new shell is called a subshell
.
[2]
So what?
There are
some important things to know
about it:
the child process gets a copy of its parent's environment.
Any changes in the environment of the child process aren't passed to its parent.
"Still," I hear you say, "so what??"
Shell scripts are run in a subshell (unless you use the
source
or .
commands (44.23
)
to start the script).
If the script makes changes to the environment of its (sub)shell,
the parent shell won't see those changes.
If the script uses cd
, it doesn't change the current directory
in the parent shell.
If the script
changes the value of the TZ
(or any) environment variable (6.7
)
,
that won't change TZ
in the parent shell.
The script can set a different
umask
(22.4
)
than the parent shell - no problem.
There are times you might want to start a subshell from your current
shell.
Maybe you have a special project where you need to work in a
different current directory, reset environment variables,
set a new home directory, reset some aliases, use a different
PATH
(6.4
)
,
whatever.
When you end the subshell, the parent shell's environment will be the way
it was.
If your parent shell has
job control (12.1
)
,
you can stop the subshell and pop back to your parent shell without losing
the changes in the subshell.
If the child shell has job control, too, the command
suspend
(22.22
)
(or kill -STOP
$$ (8.19
)
) will stop it.
Otherwise, just type CTRL-z at the subshell's prompt.
For example:
prompt
%csh
|
myprompt% csh
myprompt% set prompt="project% "
project% cd
project-directory
project% setenv PRINTER plotter
project% set path=($path
some-new-directories
)
project% setenv EXINIT "se ts=4 sw=4 aw wm=0"
...do some work...
project% suspend
Stopped
myprompt%
...back to parent shell...
myprompt% fg %csh
...back to subshell...
%
|
I use suspend
so much that I've made a CTRL-z-like alias named
z
.
A
shell escape (30.26
)
starts a subshell.
Do whatever you want to the subshell's environment.
When you end the shell escape, the changes go away.
The
su
(22.22
)
command starts a subshell.
cd
anywhere, change environment variables, and so on...
If you use the exit
command, a subshell (or any shell) will terminate.
In a script, when the shell reads the end of file, that
does an implicit exit
.
On the command line, an end-of-input character (usually CTRL-d)
will do the same thing.
Article
44.11
explains how exit
sets a shell's exit status.
|
|