Subshells
Não há como uma subshell matar o script inteiro. Sob o efeito de set -u
, um subshell não tem como dizer ao seu pai “hey, eu quero que você trate isso como um erro fatal”. Isso não faria sentido se set -u
estivesse em vigor na sub-camada, mas não em seu pai. Tudo o que a subshell pode fazer é retornar um código de saída diferente de zero. Cabe a você gerenciar esse código de saída no pai, manualmente ou por meio de set -e
.
(set -u; …; echo $undefined_variable)
# here $? is nonzero
ret=$?; if [ $ret -ne 0 ]; then exit $ret; fi
Subprocessos
O que você fez aqui não é um subshell: você está lançando outro programa. Esse outro programa é o bash, que é também o interpretador que está executando o script atual, mas é uma coincidência. Não há absolutamente nenhuma razão para que uma configuração em um programa invocado pelo bash faça com que o próprio bash saia.
set +e
bash -c 'do something'
echo "A - should and does reach here"
Isso não é diferente do que se você tivesse escrito perl -e 'use strict; print $barf'
- Perl morreria e retornaria um status diferente de zero, mas isso não faz com que o script basque saia (exceto em set -e
). Use set -e
se você quiser sair quando um subprocesso retornar um código de retorno diferente de zero.