Sub Shells

Overview

  • Are a new process
  • Have their own environment (obviously)
  • Their environment is local

You invoke a subshell with brackets () Note curly brackets {} do not start a subshell.

echo "Subshell level INSIDE MAIN SHELL: $BASH_SUBSHELL PID: $BASHPID"
(
   echo "Subshell level INSIDE FIRST SHELL: $BASH_SUBSHELL PID: $BASHPID"
)
echo "Subshell level INSIDE MAIN SHELL: $BASH_SUBSHELL PID: $BASHPID"
(
    echo "Subshell level INSIDE FIRST SHELL: $BASH_SUBSHELL PID: $BASHPID"
    (
        echo "Subshell level INSIDE SECOND SHELL: $BASH_SUBSHELL PID: $BASHPID"
    )
)
Subshell level INSIDE MAIN SHELL: 0 PID: 19301
Subshell level INSIDE FIRST SHELL: 1 PID: 19302
Subshell level INSIDE SECOND SHELL: 2 PID: 19303
outershell_var="hello from outershell_var"
gvar=
(
subshell_var="hi"
echo "subshell: subshell_var: $subshell_var"
echo "subshell: outershell_var: $outershell_var"
gvar="$subshell_var" 
)
if [ -z "$subshell_var" ]
then
 echo "subshell_var undefined in main shell"
else
 echo "subshell_var defined in main shell"
fi

echo "global_variable1: $gvar"
subshell: subshell_var: hi
subshell: outershell_var: hello from outershell_var
subshell_var undefined in main shell
global_variable1:

Since the subshells are a new process you can use redirection of the standard streams. Here is an example:

(
echo "Hello world!"
) >> a.txt


(
cat 
) < a.txt
Made with Slides.com