mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
posix: block brace expansion of unquoted expansions (re: a14d17c0)
Historically, ksh (including ksh88 and mksh) allow brace expansion
not just on literal patterns but also on patterns resulting from
unquoted variable expansions or command substitutions:
$ a='{a,b}' ksh -c 'echo X{a,b} Y$a'
Xa Xb Ya Yb
Most people expect only the first (literal) pattern to be expanded,
as in bash and zsh:
$ a='{a,b}' bash -c 'echo X{a,b} Y$a'
Xa Xb Y{a,b}
The historic ksh behaviour is poorly documented and nearly unknown,
violates the principle of least astonishment, and makes unquoted
variable expansions even more unsafe. See discussion at:
https://www.austingroupbugs.net/view.php?id=1193
https://github.com/ksh93/ksh/issues/140
Unfortunately, we cannot change it in default ksh without breaking
backward compatibility. But we can at least fix it for the POSIX
mode (which disables brace expansion by default but allows turning
it back on), particularly as it looks like POSIX, if it decides to
specify brace expansion in a future version of the standard, will
disallow brace expansion on unquoted variable expansions.
src/cmd/ksh93/sh/macro.c: endfield():
- When deciding whether to do brace expansion + globbing or only
globbing, also check that we do not have POSIX mode and an
unquoted variable expansion (mp->pattern==1).
This commit is contained in:
parent
7b8e7fbb49
commit
0602177646
5 changed files with 28 additions and 2 deletions
|
|
@ -45,6 +45,20 @@ if ((SHOPT_BRACEPAT)); then
|
|||
fi
|
||||
(set --noposix; ((SHOPT_BRACEPAT)) && set +B; eval 'set {1..4}'; let "$# == 1") || err_exit "--noposix does not allow independent control of braceexpand"
|
||||
|
||||
# When brace expansion is turned back on in POSIX mode, the values of unquoted variable expansions are not subject to it.
|
||||
# (note that, in typical quirky ksh fashion, this only happens if pathname expansion is also on, i.e. -f/--noglob is off.)
|
||||
if ((SHOPT_BRACEPAT))
|
||||
then
|
||||
got=$(set -B +f; a='x{1,2}'; print $a)
|
||||
exp='x{1,2}'
|
||||
[[ $got == "$exp" ]] || err_exit "posix braceexpand expands unquoted variable expansions" \
|
||||
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
|
||||
got=$(set --noposix +f; a='x{1,2}'; print $a)
|
||||
exp='x1 x2'
|
||||
[[ $got == "$exp" ]] || err_exit "non-posix braceexpand does not expand unquoted variable expansions" \
|
||||
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
|
||||
fi
|
||||
|
||||
# Furthermore, the posix option is automatically turned on upon invocation if the shell is invoked as sh or rsh,
|
||||
# or if -o posix or --posix is specified on the shell invocation command line, or when executing scripts
|
||||
# without a #! path with this option active in the invoking shell.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue