#!/bin/bash -e foo() { myvar="foo" echo "foo 1" echo "foo 2" false || return 1 echo "foo 3" } bar() { myvar="bar" echo "bar 1" echo "bar 2" false echo "bar 3" } echo 'calling foo and bar with || ret=$?' echo myvar="unknown" ret=0 foo || ret=$? echo "foo ret $ret" echo $myvar echo myvar="unknown" ret=0 bar || ret=$? echo "bar ret $ret" echo $myvar echo echo 'calling foo and bar with | cat -' echo myvar="unknown" foo 2>&1 | cat -; ret=${PIPESTATUS[0]} echo "foo ret $ret" echo $myvar echo myvar="unknown" bar 2>&1 | cat -; ret=${PIPESTATUS[0]} echo "bar ret $ret" echo $myvar echo