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

Re: PATCH: 3.1.9-dev-8: Re: Word splitting in zsh



On Feb 12, 10:38am, Andrej Borsenkow wrote:
}
} > This applies only to ${...+...} and ${...-...}, with or without the `:'.
} > As I mentioned, there would be some benefit to also doing this for the
} > ${...=...} forms, because then things like ${(A)foo="$bar[@]"} would work
} > independently of the setting of shwordplit.
} >
} 
} Is the following a bug in shell and should zsh emulate it?
} 
} bor@itsrm2% sh
} $ set "a b c" 1 2
} $ args ${foo="$@"}
} 3
} a b c
} 1
} 2

Bash seems to emulate it.

} In case of ${name-word} or ${name+word} sh does exactly *one* expansion (as
} opposed to zsh that does two)

That's not precisely what's happening in zsh.  It does only one expansion,
but it does word splitting based on the outer (lack of) quotes rather than
the inner ones.  Which I suppose could be called "two expansions" ...

The equivalent of the patch that I made for ${x+y} and ${x-y}, applied to
${x=y}, would have the effect of emulating the above behavior.

On Feb 12,  5:12pm, Andrej Borsenkow wrote:
} Subject: RE: PATCH: 3.1.9-dev-8: Re: Word splitting in zsh
}
} And is this a bug or feature in zsh (with Bart's patch):

Note that my patch makes absolutely no difference to this; read the very
first double-excerpted paragraph above.

} bor@itsrm2% baz=("aa bb" cc)
} bor@itsrm2% print -l "${(A)foo=$baz[@]}"
} aa bb
} cc
} bor@itsrm2% print -l "${(A)foo=$baz[@]}"
} aa bb cc
} 
} both cases should evaluate to the value of $foo, if I read specs
} properly, and be identical, i.e. as in the second case.

This is a slightly different bug; what's interesting is how bash handles
it ... note the difference between ${x+y} and ${x=y}:

[schaefer@zagzig schaefer]$ set "a1 a2 a3" b c                                 
[schaefer@zagzig schaefer]$ for i in "${1+$@}"; do echo "$i"; done
a1 a2 a3
b
c
[schaefer@zagzig schaefer]$ for i in "${foo=$@}"; do echo "$i"; done
a1 a2 a3 b c
[schaefer@zagzig schaefer]$ for i in "${foo+$@}"; do echo "$i"; done
a1 a2 a3
b
c

To "fix" this in zsh is trivial, if we want it fixed; just copy some
code from above the "Check for ${..?..} or ${..=..} or one of those."
block:

Index: Src/subst.c
===================================================================
--- Src/subst.c	2001/02/10 20:33:32	1.73
+++ Src/subst.c	2001/02/12 19:22:18
@@ -1454,6 +1454,14 @@
 		}
 		*idend = sav;
 		copied = 1;
+		if (isarr) {
+		  if (nojoin)
+		    isarr = -1;
+		  if (qt && !getlen && isarr > 0) {
+		    val = sepjoin(aval, sep, 1);
+		    isarr = 0;
+		  }
+		}
 	    }
 	    break;
 	case '?':

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com

Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net   



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