Na página de informações de bash :
All other aspects of the shell execution environment are identical between a function and its caller with these exceptions: the
DEBUGandRETURNtraps are not inherited unless the function has been given thetraceattribute using thedeclarebuiltin or the-o functraceoption has been enabled with thesetbuiltin, (in which case all functions inherit theDEBUGandRETURNtraps), and theERRtrap is not inherited unless the-o errtraceshell option has been enabled.
Então, você precisa set -o errtrace na parte superior do script para que a ERR trap seja propagada em suas funções.
Além disso, você precisa ter cuidado com essa recursiva ERR trap em err_out . Você realmente deseja definir uma nova armadilha no manipulador de erros ou deseja exibir essa mensagem? Se este último, apenas echo it; o trap só seria invocado se um erro ocorresse no seu manipulador de erros.