Background process redirect to COPROC

bash, coproc, io-redirection, ipc, pipe

Solution

You've got the answer elsewhere http://lists.gnu.org/archive/html/bug-bash/2012-06/msg00027.html:

Coproc file descriptors are not available to subshells. They're implemented using pipes, and leaving pipe file descriptors open in subshells causes processes to hang and not terminate properly, which results in very hard-to-track-down-and-reproduce bugs.

Problem

In the following test script I run an elementary coprocess to which the `echo` built-in, run in background, attaches its standard-output: ``` #!/bin/bash # TEST 1 coproc /bin/sleep 100 echo >&${COPROC[1]} & ``` The script always fails, for no apparent reason, giving the output: ``` ./test.sh: line 4: ${COPROC[1]}: Bad file descriptor ``` I wonder if the correct syntax should be rather this one (ampersand moved before redirection): ``` #!/bin/bash # TEST 2 coproc /bin/sleep 100 echo & >&${COPROC[1]} ``` This second example seems to work since it reports no errors during execution, but with this syntax, the redirection is not performed in practice; in fact, consider this other test: ``` #!/bin/bash # TEST 3 /bin/echo abc & >xfile ``` Test 3 creates the file `xfile`, but does not write anything into it. Curiously, trying again to position the ampersand after the redirection make the `echo` work fine: ``` #!/bin/bash # TEST 4 /bin/echo abc >xfile & ``` Test 4 creates the file `xfile` with inside the string `abc`. Have some idea on what is causing the `coproc` redirection error or what the correct syntax is?

Original source