Op 04-10-17 om 17:52 schreef Chet Ramey: > It's interesting that other shells treat ${a:=b} as kind of like an > assignment statement (word splitting) but not quite (tilde expansion).
Hmm... v=~/bla printf '%s\n' "$v" outputs /Users/martijn/bla on all shells, so tilde expansion applies for a simple assignment anyway. And unset -v v v=${v:=~/bla} printf '%s\n' "$v" acts exactly the same. This is all POSIXly correct, IIRC. Of course, when ${v:=~/bla} is an unquoted expansion in a non-assignment context, field splitting and pathname expansion apply to the expansion, but not to the assignment itself, which is also perfectly logical: [ -n "${ZSH_VERSION+s}" ] && emulate sh unset -v v touch /tmp/foo.bar /tmp/baz.bar printf 'field: [%s]\n' ${v:=~/one ~/two /tmp/*.bar} printf ' var: [%s]\n' "$v" Output on bash, dash, FreeBSD sh, Busybox ash, yash, pdksh, mksh, ksh93, zsh up to 5.0.8: field: [/Users/martijn/one] field: [~/two] field: [/tmp/baz.bar] field: [/tmp/foo.bar] var: [/Users/martijn/one ~/two /tmp/*.bar] Output on zsh 5.1 and later, it seems to do tilde expansion after word splitting instead of before -- which looks like a bug[*2], I'll take that up there: field: [/Users/martijn/one] field: [/Users/martijn/two] field: [/tmp/baz.bar] field: [/tmp/foo.bar] var: [/Users/martijn/one ~/two /tmp/*.bar] Output on bosh (schilytools) and NetBSD sh -- clearly a bug, it doesn't do tilde expansion at all: field: [~/one] field: [~/two] field: [/tmp/baz.bar] field: [/tmp/foo.bar] var: [~/one ~/two /tmp/*.bar] - Martijn [*1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_01 [*2] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06