svn commit: r194774 - head/bin/sh
Jilles Tjoelker
jilles at FreeBSD.org
Tue Jun 23 21:50:08 UTC 2009
Author: jilles
Date: Tue Jun 23 21:50:06 2009
New Revision: 194774
URL: http://svn.freebsd.org/changeset/base/194774
Log:
Do not fork for a subshell if it is the last thing this shell is doing
(EV_EXIT). The fork is still done as normal if any traps are active.
In many cases, the fork can be avoided even without this change by using {}
instead of (), but in practice many scripts use (), likely because the
syntax is simpler.
Example:
sh -c '(/bin/sleep 10)& sleep 1;ps -p $! -o comm='
Now prints "sleep" instead of "sh". $! is more useful this way.
Most shells (dash, bash, pdksh, ksh93, zsh) seem to print "sleep" for this.
Example:
sh -c '( ( ( (ps jT))))'
Now shows no waiting shell processes instead of four.
Most shells (dash, bash, pdksh, ksh93, zsh) seem to show zero or one.
PR: bin/74404
Approved by: ed (mentor) (implicit)
Modified:
head/bin/sh/eval.c
Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c Tue Jun 23 21:48:04 2009 (r194773)
+++ head/bin/sh/eval.c Tue Jun 23 21:50:06 2009 (r194774)
@@ -401,8 +401,8 @@ evalsubshell(union node *n, int flags)
int backgnd = (n->type == NBACKGND);
expredir(n->nredir.redirect);
- jp = makejob(n, 1);
- if (forkshell(jp, n, backgnd) == 0) {
+ if ((!backgnd && flags & EV_EXIT && !have_traps()) ||
+ forkshell(jp = makejob(n, 1), n, backgnd) == 0) {
if (backgnd)
flags &=~ EV_TESTED;
redirect(n->nredir.redirect, 0);
More information about the svn-src-all
mailing list