home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam  


UNIX Power Tools

UNIX Power ToolsSearch this book
Previous: 38.3 Managing Processes: Overall Concepts Chapter 38
Starting, Stopping, and Killing Processes
Next: 38.5 The ps Command
 

38.4 Subshells

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]

[1] This isn't true when the subprocess is exec d from the parent process without a fork first. Article 38.2 explains.

[2] When you use the shell's exec (45.7 ) command, it does not start a subprocess.

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.

- JP


Previous: 38.3 Managing Processes: Overall Concepts UNIX Power Tools Next: 38.5 The ps Command
38.3 Managing Processes: Overall Concepts Book Index 38.5 The ps Command

The UNIX CD Bookshelf NavigationThe UNIX CD BookshelfUNIX Power ToolsUNIX in a NutshellLearning the vi Editorsed & awkLearning the Korn ShellLearning the UNIX Operating System