No, manually starting a new shell (via /bin/sh or /bin/bash , etc.) is not a subshell in this context.
A subshell is when the shell spawns a new instance of the shell on its own to handle some work.
Usage Substitution substitution (i.e. $(command) ) is a subshell (like the previous call to backticks).
Using a pipeline (i.e. echo '5.1+5.3' | bc -l ) creates subshells for each pipeline component.
Use Process substitution (i.e., <(command) ) creates a subshell.
Grouping commands (i.e. (declare a=5; echo $a) ) create a subshell.
Running commands in the background (i.e. sleep 1 & ) creates a subshell.
There may be other things, but these are common cases.
Testing is easy:
$ printf "Outside: $BASH_SUBSHELL , $SHLVL\nInside: $(echo $BASH_SUBSHELL , $SHLVL)\n" Outside: 0 , 1 Inside: 1 , 1 $ (printf "Outside: $BASH_SUBSHELL , $SHLVL\nInside: $(echo $BASH_SUBSHELL , $SHLVL)\n") Outside: 1 , 1 Inside: 2 , 1 $ bash -c 'printf "Outside: $BASH_SUBSHELL , $SHLVL\nInside: $(echo $BASH_SUBSHELL , $SHLVL)\n"' Outside: 0 , 2 Inside: 1 , 2 $ bash -c '(printf "Outside: $BASH_SUBSHELL , $SHLVL\nInside: $(echo $BASH_SUBSHELL , $SHLVL)\n")' Outside: 1 , 2 Inside: 2 , 2
The source of your quote (usually bad, and often avoided by ABS ) even demonstrates this a little (and in a rather obscure way, just another example of the general lack of rigor and quality in this "Advanced" manual):
echo " \$BASH_SUBSHELL outside subshell = $BASH_SUBSHELL" # 0 ( echo " \$BASH_SUBSHELL inside subshell = $BASH_SUBSHELL" ) # 1 ( ( echo " \$BASH_SUBSHELL inside nested subshell = $BASH_SUBSHELL" ) ) # 2 # ^ ^ *** nested *** ^ ^ echo echo " \$SHLVL outside subshell = $SHLVL" # 3 ( echo " \$SHLVL inside subshell = $SHLVL" ) # 3 (No change!)