#!/bin/bash # function launch { # exec 3>&1 1>&2 2>&3 ./useless.sh # exec 3>&1 1>&2 2>&3 # } function on_exit { FAILURE=${1:-0} [[ $FAILURE -gt 0 ]] && >&2 echo EXIT "$FAILURE" trap - ERR TERM INT EXIT } export -f on_exit { myvar=$(bash -c " set -TEue -o pipefail; trap 'on_exit \$?' ERR TERM INT EXIT . ./useless.sh " 3>&1 1>&2 2>&3 | tee /dev/fd/4 | 3>&5 1>&2 2>&3 tee /dev/fd/5) } 5>&1 4>&2 # magic trick: fd4 grabs stderr, then show up again on stderr echo ---------- echo -e "stderr is:\n$myvar"