|
From: | Tobias Hoffmann |
Subject: | Re: coproc state wrongly inherited by subshell |
Date: | Wed, 06 Dec 2017 19:02:29 +0100 |
User-agent: | Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.12) Gecko/20130116 Icedove/10.0.12 |
On 03/12/17 21:14, Chet Ramey wrote:
Well, there seem to be two types of subshells: Those spawned with (... ), &, or | -- and those coming from $(...) and <( ... ).On 11/29/17 5:36 PM, Tobias Hoffmann wrote:Description: As stated in the man page, bash will only allow a single coproc at a time. Thus, when a first coproc has already ended, a second one can be created. This can e.g. be verified by commenting out the upper #sleep line, below. Alternatively, you can remove the parens that start the subshell. But if we start a subshell while the coproc still runs, then wait inside the subshell until the first coproc has ended and then try to start another coproc, bash prints the infamous warning: ./test_sp1.sh: line 10: warning: execute_coproc: coproc [11030:COPROC] still exists The process id 11030 does (verifyably - e.g. add `ps a`) not exist the time the warning is printed.░The question is how much to reset, and when to do it. A child process can legitimately expect to inherit the coproc file descriptors from its parent and read and write them under circumstances that have been valid historically.
In both of them $COPROC[] and $COPROC_PID are available, but only in the second kind you can actually use the file descriptors. In the first kind, you'll get (e.g.)
${COPROC[1]}: Bad file descriptor (i.e. does not work, as documented).You can, however, make them available even in the first kind, by duping them first, e.g. by using
exec {fd}>&${COPROC[1]}I'm not sure whether using them directly in the first kind of subshell is actually a good idea. Some things seem to work better when duping them first, but I have not investigated those cases further.
Tobias
The pid will never be valid for waiting in the child, because it's not a child of the current shell, but simply testing whether or not the process is alive isn't sufficient. I think the best thing to do is to invalidate the pid whenever a child process invalidates the coproc FDs. Chet
[Prev in Thread] | Current Thread | [Next in Thread] |