On Thu, Jul 24, 2014 at 11:35:01AM -0400, David Korn wrote:
> I finally got a chance to look at this.
> 
> The problem is that the standard is ambiguous about when a command
> substitution ends.
> 
> The bourne shell used a pipe for command substitution and command
> substitution  terminated when the pipe closed.  Thus, if you had a command
> the wrote on standard output, forked and exited and the child wrote on that
> pipe, the output from both processes was part of the command substitution.
> 
> ksh considered the command substitution done when the command completed and
> used memory for files less that 64K(IOBSIZE)  and this created a tmp file
> if it was larger.
> 
> I tried to restore the old bourne shell semantics for `` so that the
> foreback test would work.  However, this caused the example you have to
> hang.  Here is a change which should fix this by using pipes for all `` not
> just large ones.  Here is the one line patch:
> 
> --- old/sh/subshell.c      Wed Apr  2 09:57:00 2014
> +++new/sh/subshell.c       Thu Jul 24 11:19:43 2014
> @@ -593,7 +574,7 @@
>                         sp->tmpfd = -1;
>                         sp->pipefd = -1;
>                         /* use sftmp() file for standard output */
> -                       if(!(iop = sftmp(comsub==1?PIPE_BUF:IOBSIZE)))
> +                       if(!(iop = sftmp(comsub==1?0:IOBSIZE)))
>                         {
>                                 sfswap(sp->saveout,sfstdout);
> 
> errormsg(SH_DICT,ERROR_system(1),e_tmpcreate);
> 
> 
> Let me know.
> 

This works for the specific code but break other tests,
from ksh test suite

 [ 1162s] test subshell begins at 2014-07-25+07:39:05
 [ 1175s] foo
 [ 1175s]        subshell.sh[642]: nested command substitution with 2>&1 not 
working
 [ 1178s] test subshell failed at 2014-07-25+07:39:21 with exit code 1 [ 70 
tests 1 error ]
 [ 1178s] test subshell(C.UTF-8) begins at 2014-07-25+07:39:21
 [ 1194s] foo
 [ 1194s]        subshell.sh[642]: nested command substitution with 2>&1 not 
working
 [ 1197s] test subshell(C.UTF-8) failed at 2014-07-25+07:39:40 with exit code 1 
[ 70 tests 1 error ]
 [ 1197s] test subshell(shcomp) begins at 2014-07-25+07:39:40
 [ 1211s] foo
 [ 1211s]        shcomp-subshell.ksh[642]: nested command substitution with 
2>&1 not working
 [ 1214s] test subshell(shcomp) failed at 2014-07-25+07:39:57 with exit code 1 
[ 70 tests 1 error ]

from my own test suite

 [ 1233s] ++ /tmp/ksh-build.D5gJUl/bin/ksh -k -c 'd=`/bin/echo x y=z`; echo $d 
x y=z'
 [ 1233s] + result='x
 [ 1233s] x'
 [ 1233s] + test 'x
 [ 1233s] x' = 'x x'
 [ 1233s] + exit 1

also further tests do fail

 result=$(/tmp/ksh-build.D5gJUl/bin/ksh -c 'echo | echo "x`/bin/echo y`"')
 echo "$result"
 x
 y
 result=$(/tmp/ksh-build.D5gJUl/bin/ksh -c 'echo | echo "x$(/bin/echo y)"')
 echo "$result"
 xy

now it seems that newlines will cause trouble.

Also the question rise why there is this difference between `...` and $(...) or
why not map `...` to $(...) ?

Werner

-- 
  "Having a smoking section in a restaurant is like having
          a peeing section in a swimming pool." -- Edward Burr

Attachment: pgpTPL55qyjmg.pgp
Description: PGP signature

_______________________________________________
ast-developers mailing list
[email protected]
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to