On 8/22/16 3:38 PM, helmut.karlow...@ish.de wrote: > When doing redirection inside a sub-process to a descriptor that is > redirected to a file the output of the subshell goes into the file.
Child processes created to run subshells inherit open file descriptors from their parent. > Now when the same descriptor is again redirected to another descriptor for > this whole > command-list, the output of the sub-process goes to the other descriptor. > > Except when the subshell is subject to process-substitution: In this > case the outer redirection has no effect to the sub-process. Why is that? It has to do when things are processed. Process substitution is not a command or a redirection: it is a word expansion that expands to a file name. Word expansions are performed before redirections. When the process substitution is expanded, nothing has run that changes file descriptor 3 away from the file (tb.err). > rm -f tb.err > exec 3>tb.err > echo ------ 1 ---------- > (echo 1 1>&3) 3>&1 This is not relevant; the subshell is a command to which the redirection applies. > echo ........tb.err ........... > cat tb.err > echo ------ 2 --------- > echo >(echo 2 1>&3) 3>&1 The process substitution is expanded before the redirection (which applies to the `echo', since that is the command) is performed. When the subshell starts, fd 3 still points to tb.err. > echo ------ 3 --------- > echo >(echo 3 1>&3) > echo ........tb.err ........... This redirects file descriptor 1 away from the pipe to the descriptor the subshell inherits from its parent. Chet -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, UTech, CWRU c...@case.edu http://cnswww.cns.cwru.edu/~chet/