The 4.1 man page says: ${!prefix*} ${!pre...@} Names matching prefix. Expands to the names of variables whose names begin with prefix, separated by the first character of the IFS special variable. When @ is used and the expansion appears within double quotes, each variable name expands to a separate word.
Actually, the IFS rule only applies when the "${!prefix*}" is quoted. imadev:~$ IFS='+x' imadev:~$ echo ${!P*} P4CLIENT PAGER PATH PIPESTATUS PKG_CONFIG_PATH PPID PS1 PS2 PS4 PWD imadev:~$ echo "${!P*}" P4CLIENT+PAGER+PATH+PIPESTATUS+PKG_CONFIG_PATH+PPID+PS1+PS2+PS4+PWD Or, using a special script to see the arguments more clearly: imadev:~$ args ${!P*} 10 args: <P4CLIENT> <PAGER> <PATH> <PIPESTATUS> <PKG_CONFIG_PATH> <PPID> <PS1> <PS2> <PS4> <PWD> imadev:~$ args "${!P*}" 1 args: <P4CLIENT+PAGER+PATH+PIPESTATUS+PKG_CONFIG_PATH+PPID+PS1+PS2+PS4+PWD> I believe this is intended behavior (since it matches how $* works), and that the man page is simply misleading.