> > POSIX's Shell and Utilities (XCU) 2.12 [1] does say that "[the] > > environment of the shell process shall not be changed by the utility", > > and that environment includes open files. My understanding is that > > dash's new behaviour (and incidentally, ksh93's one) is incorrect.
> As I understand it, the intent of that section was not to prohibit > changes in process state due to a command like "exec foo" replacing > the shell process. The shell execution environment is not changed but > simply no longer exists once execve() has been called. The word "process" seems a bit awkward here, yes. For the most part, POSIX is very careful in writing "shell environment" instead of "shell process", so that creating a new process can often be avoided by clever implementations. Anyway, if the shell has found that it can safely exec a simple command without forking (or run a subshell without forking), there is no possibility of any execution in the original shell environment, so there seems no need to preserve any open files or other resource needed for such execution. Note that 2.7 Redirection does not say anything explicit about preserving the previous content of file descriptors, only that a redirection on a command (except 'exec') shall be in effect during that command only. Therefore, the shell only needs to save file descriptors at high numbers if it may need to execute subsequent commands in the same process ("may" because a trap for EXIT might be set in the command, if it is not external). Also note that 2.9.1 Simple Commands does not explicitly call for creating a new process. If there are subsequent commands, the shell will obviously need to create a new process, but otherwise that is not needed. > More to the point, POSIX is very easy to change[1], so if this > behavior is causing a problem in otherwise reasonable application > code, methinks it would be better to discuss that instead... The behaviour you are complaining about exists in almost all shells (tried: FreeBSD /bin/sh, dash, bash, zsh, mksh, ksh93, Heirloom Bourne shell, kBuild kmk_ash (much like NetBSD /bin/sh)) in some contexts, so it is unlikely to change. To demonstrate, where ${SH} is the shell to be tested: ${SH} -c '/bin/sleep 10 >/dev/null &' | { cat; echo EOF; } The "EOF" line appears immediately in all tested shells, showing that there is nothing holding onto the pipe in the subshell environment created by '&'. On the other hand, if the redirection is 2>/dev/null instead, it takes ten seconds before "EOF" appears, as in this case the pipe file descriptor is passed on. If braces or parentheses are added around the sleep command (including or not including the redirection), behaviour varies per shell. Likewise, behaviour for { ${SH} -c '/bin/sleep 10 >/dev/null' & } | { cat; echo EOF; } varies per shell, and I do not see a reason why this should keep the pipe file descriptor open while shells clearly agree that it should not be kept open in the first example. (Note that I write /bin/sleep explicitly, because some shells have a sleep builtin.) -- Jilles Tjoelker -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org