You cannot just capture return code as you typically would (Using [ "$?" -eq 0 ]). Since you will end up capturing the return code of tee which will be successful if tee was able to write to file.
Hence you need to use ${PIPESTATUS[0]}
some_func(){ return 1}main() { some_func 2>&1 | tee /tmp/out return_code="${PIPESTATUS[0]}" echo "Return code from original command: ${return_code}" if [ "$return_code" -eq 0 ]; then echo_green "success" else echo_red "failure" return 1; fi}main "${@}" || exit 1