Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Jun 2009 21:50:06 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r194774 - head/bin/sh
Message-ID:  <200906232150.n5NLo6ws091320@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906232150.n5NLo6ws091320>