Hi,
As tested interactively with bash 5.0.7(1) and GNU/Linux, the following command
prints a constant number of active file descriptors, as expected:
$ while :; do { read; } < <(:); sleep 0.5; printf %s\\n /proc/self/fd/* | wc
-l; done
6
6
6
6
6
... etc
However, merely by assigning a variable prior to the loop, though within the
same line, the number will continuously grow:
$ var=0; while :; do { read; } < <(:); sleep 0.5; printf %s\\n /proc/self/fd/*
| wc -l; done
6
7
8
9
10
... etc
If then adjusted so that the read command is not part of a compound command,
normality is restored:
$ var=0; while :; do read < <(:); sleep 0.5; printf %s\\n /proc/self/fd/* | wc
-l; done
5
5
5
5
5
... etc
I noticed this behaviour upon running out of file descriptors after executing
structurally similar code that deliberately utilises a compound command to read
twice, thus discarding the first line of input.
--
Kerin Millar <[email protected]>