Hi,
When IFS is unset, unquoted $* undergoes word splitting as if IFS=' ',
and not the expected IFS=$' \t\n'. All the other unquoted mass
expansions ($@, array[*], array[@]) are word-split as if IFS=$'
\t\n'.For instance:
nb_args() { echo $#; }
set -- $'a\nb'
unset IFS
# Expected: 2, actual: 2
nb_args $@
# Expected: 2, actual: 1
nb_args $*
ar=("$@")
# Expected: 2, actual: 2
nb_args ${ar[*]}
# Expected: 2, actual: 2
nb_args ${ar[@]}
Note that this only occurs if IFS is *globally* unset. If made local and
then unset (as in f() { local IFS; unset IFS; ... }), $* is word-split
as expected.
This is a regression that appeared in 4.3 and is still present on devel
(bash-snap-20170616). A git bisect on devel shows that commit
1a81420a36fa (bash-20130125 snapshot) introduced this change. It seems
indeed that this commit is related to the handling of $* when IFS is
unset, but my knowledge of Bash's sources is too limited to tell what's
wrong with it :-)
Kevin