Funções são a maneira geral de reduzir a duplicação de código. Este caso não é diferente. Você só precisa definir uma função para implementar sua lógica while read
.
myfunc() {
while read LINE
do
prog_1
prog_2
...
prog_n
done
}
if [[ -t 0 ]]; then
myfunc # read stdin passed to the script
else
myfunc < "$1" # redirect file to stdin
fi