bug() { trap : exit # Bug was causing sh to be run in subshell, # as if this line is replaced with (sh -c ...; exit $?) & # here: sh -c 'echo REAL_CHILD=$$' & echo PARENTS_IDEA_OF_CHILD=$! wait # make sure bkgd shell completes } bug | { while read varval; do eval $varval done test x"$REAL_CHILD" != x"" \ && test x"$REAL_CHILD" = x"$PARENTS_IDEA_OF_CHILD" echo "Bug detected: $?" }