This specific behavior is still found in "GNU bash, Version 4.4.12(1)-release" from Debian 9 Stretch, but a new shell option enables the more consistent behavior of other shells.
Subshells for command substitutions do not automatically inherit the option "errexit". This must be enabled by another option "inherit_errexit". The manual page for the bash explains it like:
inherit_errexit If set, command substitution inherits the value of the errexit option, instead of unsetting it in the subshell environment. This option is enabled when posix mode is enabled.
Using this option gives the expected result:
hb1@debian:~$ bash -c 'set -e ; z=$(false;echo foo) ; echo $z' foo hb1@debian:~$ echo $? 0 hb1@debian:~$ bash -c 'set -e ; shopt -s inherit_errexit ; z=$(false;echo foo) ; echo $z' hb1@debian:~$ echo $? 1
As mentioned in the manual, the POSIX mode also gives the expected result:
hb1@debian:~$ bash --posix -c 'set -e ; z=$(false;echo foo) ; echo $z' hb1@debian:~$ echo $? 1
The Bash Reference Manual explains the difference:
42. Enabling POSIX mode has the effect of setting the inherit_errexit option, so subshells spawned to execute command substitutions inherit the value of the -e option from the parent shell. When the inherit_errexit option is not enabled, Bash clears the -e option in such subshells.
The Bash Reference Manual can be installed with the Debian package "bash-doc". Then see: file:///usr/share/doc/bash/bashref.html#Bash-POSIX-Mode The option inherit_errexit is new in bash-4.4. The file /usr/share/doc/bash/NEWS.gz lists it under the first topic:
This is a terse description of the new features added to bash-4.4 since the release of bash-4.3. [...] ii. inherit_errexit: a new `shopt' option that, when set, causes command substitutions to inherit the -e option. By default, those subshells disable -e. It's enabled as part of turning on posix mode.
-- Regards, Hartmut Buhrmester