eval $(cat ...)
não funciona em todos os casos. Por exemplo, as quebras de linha são convertidas em um único espaço em $(cat ...)
antes que o conteúdo seja processado por eval
. Isso geralmente quebra instruções de várias linhas, como loops e documentos aqui.
Tente, por exemplo, o seguinte arquivo com os dois métodos:
for i in 1 2 3; do
echo $i
done
cat<<EOF
a
b
c
EOF