diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/macro.c --- ksh-20120801/src/cmd/ksh93/sh/macro.c.fd2lost 2014-01-22 16:23:21.211658984 +0100 +++ ksh-20120801/src/cmd/ksh93/sh/macro.c 2014-01-22 16:23:21.243658703 +0100 @@ -391,7 +391,7 @@ void sh_machere(Shell_t *shp,Sfio_t *inf break; } case S_PAR: - comsubst(mp,(Shnode_t*)0,1); + comsubst(mp,(Shnode_t*)0,3); break; case S_EOF: if((c=fcfill()) > 0) @@ -1165,7 +1165,7 @@ retry1: case S_PAR: if(type) goto nosub; - comsubst(mp,(Shnode_t*)0,1); + comsubst(mp,(Shnode_t*)0,3); return(1); case S_DIG: var = 0; diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/subshell.c --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.fd2lost 2014-01-22 16:23:21.222658887 +0100 +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2014-01-22 16:23:21.243658703 +0100 @@ -122,7 +122,8 @@ void sh_subtmpfile(Shell_t *shp) else if(errno!=EBADF) errormsg(SH_DICT,ERROR_system(1),e_toomany); /* popping a discipline forces a /tmp file create */ - sfdisc(sfstdout,SF_POPDISC); + if(shp->comsub != 1) + sfdisc(sfstdout,SF_POPDISC); if((fd=sffileno(sfstdout))<0) { /* unable to create the /tmp file so use a pipe */ @@ -635,6 +636,13 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_ } else { + if(comsub!=1 && shp->spid) + { + job_wait(shp->spid); + if(shp->pipepid==shp->spid) + shp->spid = 0; + shp->pipepid = 0; + } /* move tmp file to iop and restore sfstdout */ iop = sfswap(sfstdout,NIL(Sfio_t*)); if(!iop) diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/xec.c --- ksh-20120801/src/cmd/ksh93/sh/xec.c.fd2lost 2014-01-22 16:23:21.237658756 +0100 +++ ksh-20120801/src/cmd/ksh93/sh/xec.c 2014-01-22 16:38:36.374666019 +0100 @@ -1756,6 +1756,8 @@ int sh_exec(register const Shnode_t *t, nlock--; job_unlock(); } + if(shp->subshell) + shp->spid = parent; if(type&FPCL) sh_close(shp->inpipe[0]); if(type&(FCOOP|FAMP)) @@ -1771,7 +1773,11 @@ int sh_exec(register const Shnode_t *t, if(shp->pipepid) shp->pipepid = parent; else + { job_wait(parent); + if(parent==shp->spid) + shp->spid = 0; + } if(shp->topfd > topfd) sh_iorestore(shp,topfd,0); if(usepipe && tsetio && subdup && unpipe)