trap is a setjmp/longjmp type outcome. You pop up in a call you didn't
exactly "plan" for (well you did: you wrote it. But you don't know the
entry state which led you there, unlike normal program flow) -well, it
is.. because you get there.

I once won a Usenix contest for using /bin/sh to test your reflexes.

trap "ls | wc ; exit 0" 0 1 2 3 15
ls * | wc -l
echo "Type ^C; see how close you can make your number match"
rm -rf * | wc -l
kill -1 $$ # For those without "trap 0"