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