догадайтесь, что выдаст консоуль в каждом из случаев
echo "1" > test.tmp #1 t=2; cat test.tmp | read t; echo $t #2 t=2; read t < test.tmp; echo $t #3 t=2; cat test.tmp | while read t; do echo $t; done; echo $t