pas vraiment... la syntaxe $(...) charge tout en mémoire, et perd des informations en traitant de la même façon espaces et fin de ligne. S'il y a beacoup de lignes (plus que 32Ko, ça ne passe plus). En plus, il faut attendre d'avoir lu la dernière ligne pour continuer le script.
Les syntaxes utilisant les pipes sont meilleurs, car les éléments sont traités les uns après les autres, et restent séparés par les fins de ligne.
Il suffit de comparer :
for fichier in $(echo xxxx; echo un fichier; echo un autre fichier)
do
echo "$fichier"
done
avec :
while read fichier
do
echo "$fichier"
done < <(echo xxxx; echo un fichier; echo un autre fichier)
ou (principe équivalent, mais écrit différemment)
echo xxxx; echo un fichier; echo un autre fichier | while read fichier
do
echo "$fichier"
done
Quant à mettre le <(..) vers le done, c'est en fait très logique : la redirection porte sur l'ensemble de la boucle, incluant le read, même si celui-ci figure en haut. Il ne faut pas écouter son intution en mettant while read < fichier, car dans ce cas, on ré-initialise la lecture du fichier à chaque parcourt de boucle. Résultat, on tombe dans une boucle infinie ne lisant à chaque fois que la première ligne du fichier :
while read x < <(echo un; echo deux; echo trois)
do
echo $x
done