When /dev/fd is missing, and named pipes are used instead (like on AIX), this snippet sometimes does work right, wrong, or hang - depending on the operating system's process scheduler timing:
for x in {0..9}; do echo $x; done > >( cnt=0; while read line; do let cnt=cnt+1; done; echo $cnt ) To reproduce this problem on Linux, add this line to subst.c to enforce the problematic timing behaviour: #if !defined (HAVE_DEV_FD) + sleep(1); fifo_list[nfifo-1].proc = pid; #endif and enforce using named pipes: bash_cv_dev_fd=absent ./configure ... --- subst.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subst.c b/subst.c index 48c89c1..afae3b7 100644 --- a/subst.c +++ b/subst.c @@ -5075,7 +5075,7 @@ process_substitute (string, open_for_read_in_child) #if !defined (HAVE_DEV_FD) /* Open the named pipe in the child. */ - fd = open (pathname, open_for_read_in_child ? O_RDONLY|O_NONBLOCK : O_WRONLY); + fd = open (pathname, open_for_read_in_child ? O_RDONLY : O_WRONLY); if (fd < 0) { /* Two separate strings for ease of translation. */ -- 1.8.1.5