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)
This commit is contained in:
parent
4a22bb75d2
commit
fafc9ed682
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user