Habe das jetzt mal anhand dieses Textes getestet:
Code: Alles auswählen
#exec 3<&0; fd=3
fd=1
pause(){
read v <& $fd ## entspricht read -u $fd v
}
[ -e FILE ] || printf "1\n2,a\n3,b,c\n4,d\n5\n" > FILE
pid="$$"; printf "${pid}\n" ## ls /proc/${pid}/fd
while IFS=, read var1 var2; do
printf "${var1}\n${var2}\n"
pause
done < FILE
Der Punkt, der mich störte, war die mehrfache Verwendung der Standardausgabe (0=Standardeingabe stdin, 1=Standardausgabe stdout, 2=Standardfehlerausgabe stderr). Hat am Freitag, auch nach relativ ausgiebigen Tests, reibungslos funktioniert. Trotzdem sieht das falsch aus bzw. fühlt sich falsch an, die vorbelegten Dateideskriptoren, ohne Übergabe, einfach anderweitig zu gebrauchen. Und ehrlich gesagt, mir ist auch nicht ganz klar, wieso das so geräuschlos funktioniert!? Aber das tut es und zwar als Skriptparameter mit vorgesetztem bash, mksh und sh (dash) in allen Fällen. Ist also auch kein Feature z.B. der Bash. Man kann stdout weiterhin fehlerlos benutzen (vor, während oder nach der Schleife; in oder außerhalb der Funktion), mit allen drei getesteten Shells, so als hätte die Übergabe überhaupt keine Auswirkung darauf!?
Dennoch - intuitiv ist diese Vorgehensweise trotzdem falsch. Von der Logik her besser den FD umlenken, dazu einfach die Kommentierung der ersten beiden Skiptzeilen umkehren. Den Dateideskriptor 3 könnte man dann noch am Skriptende (mittels trap) löschen, aber die Eltern-ID (PPID) weiß eh nichts davon; spielt also keine Rolle.
Vielleicht kann ja sonst wer zur Thematik noch erhellend beitragen?!