What is a Subshell?

From Linux Shell Scripting Tutorial - A Beginner's handbook
Jump to: navigation, search
← Use the trap statement to catch signals and handle errorsHomeCompound command →
  • Whenever you run a shell script, it creates a new process called subshell and your script will get executed using a subshell.
  • A Subshell can be used to do parallel processing.
  • If you start another shell on top of your current shell, it can be referred to as a subshell. Type the following command to see subshell value:


echo "Current shell: $BASH_SUBSHELL"; ( echo "Running du in subshell: $BASH_SUBSHELL" ;cd /tmp; du 2>/tmp/error 1>/tmp/output)
  • Any commands enclosed within parentheses are run in a subshell.

Exporting Functions and Variables

A subshell does not inherit a variable's setting. Use the export command to export variables and functions to subshell:

export WWWJAIL
die() { echo "$@"; exit 2; } 
export -f die
# now call script that will access die() and $WWWJAIL
/etc/nixcraft/setupjail -d cyberciti.com
  • However, environment variables (such as $HOME, $MAIL etc) are passed to subshell.

Use exec command to avoid subshell

You can use the exec command to avoid subshell. The exec command replaces this shell with the specified program without swapping a new subshell or proces. For example,

exec command
# redirect the shells stderr to null
exec 2>/dev/null

The . (dot) Command and Subshell

The . (dot) command is used to run shell scripts as follows:

. script.sh

The dot command allows you to modify current shell variables. For example, create a shell script as follows called /tmp/dottest.sh:

echo "In script before : $WWWJAIL"
echo "In script after : $WWWJAIL"

Close and save the file. Run it as follows:

chmod +x /tmp/dottest.sh

Now, define a variable called WWWJAIL at a shell prompt:


Sample outputs:


Run the script:


Check the value of WWWJAIL:


You should see the orignal value of $WWWJAIL (/foobar) as the shell script was executed in a subshell. Now, try the dot command:

 . /tmp/dottest.sh

Sample outputs:


The value of $WWWJAIL (/apache.jail) was changed as the script was run in the current shell using the dot command.

← Use the trap statement to catch signals and handle errorsHomeCompound command →

<meta name="keywords" content="subshell, bash, linux, linux subshell, bash subshell, unix subshell"></meta> <meta name="description" content="Explains a subshell which is nothing but a child process launched by a shell or shell scripts under UNIX / Linux bash shell."></meta>