On Thu, Jun 24, 2021 at 10:53 AM Alvin Seville <alvinseville...@gmail.com> wrote:
> Hello! I want to understand why the following code doesn't produce any > error: > set -- "a b" "c" > a="$@" > ? I expected smth like: main.sh: line 2: b: command not found due to word > splitting according to documentation > < > https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameters > >. > What am I missing? > It's a bit oddly put in the manual. It doesn't actually get word-split as such, it just gives the individual positional parameters joined with spaces to a single string. 3.4.2 Special Parameters explains that: "$@: In contexts where word splitting is not performed, this expands to a single word with each positional parameter separated by a space." But 3.4 Shell Parameters is a bit confusing: "Word splitting is not performed, with the exception of "$@" as explained below." I'm not sure if this is meant to refer to that sentence 3.4.2, but it's a bit confusing since that one refers to cases without word splitting. It would probably be clearer to not call it an exception and just refer to Special Parameters for how $@ behaves when not word-split. Anyway, it may be better to use a="$*" as it's treated more consistently between different shells. a="$@" uses the first character of IFS as the separator in some shells (Zsh, Busybox, Debian/Ubuntu's Dash), and a space always in others (Bash, Ksh), while a="$*" consistently uses the first character of IFS. With the default IFS, the result is of course the same.