Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Order of field splitting in zsh



Andrej Borsenkow wrote:
> 
> POSIX.2 defines the following order of expansions in sh:
> 
> 1. tilde expansion, parameter expansion, command substitution, arithmetic
> expansion
> 2. field splitting (_after_ the above)
> 3. pathname expansion (globbing)
> 4. qoute removal.
> 
> It seems, that zsh (even if invoked as sh) does field splitting on result
> of command substitution  _immidiately_ after getting the value. The
> example is:
> 
> % sh #where sh is linked to zsh
> % args a$(echo a b)b${IFS::=:}
> 3
> aa
> bb
> %
> 
> (the third being null string). If I understand POSIX specs right, it
> should give _two_ arguments ('aa bb' and empty).
> 
> This example is obviously artificial; I fail currently to state if it can
> be a problem in real life or not. (Note, that ${var::=val} is illegal in
> POSIX; I use it to just demonstrate order of substitutions).

You are right but that can only cause problems when IFS changes in step
one, and under POSIX it can only happen when it was set to the empty string
previously.  I checked AT&T ksh and pdksh:

% ksh
$ args () { for i; do echo $i; done ; }
$ IFS=
$ args $(echo a b c)${IFS:=' '}
a b c
$ args $(echo a b c)${IFS:=' '}
a
b
c

As you see ksh behaves like zsh.  Bash behaves as POSIX requires.  But I do
not think it is a real problem, and the fix would just complicate the code
unnecessarily.  Note that both ksh I tested claims POSIX compilance.

Zoltan



Messages sorted by: Reverse Date, Date, Thread, Author