I'll lump a few issues together here... 1. Backslash escape adjacent to "$@" expansion separates words.
$ set -- abc def ghi; printf '<%s> ' "123 $@ 456"; echo <123 abc> <def> <ghi 456> $ set -- abc def ghi; printf '<%s> ' "123 $@\ 456"; echo <123 abc> <def> <ghi\> <456> Other shells don't do this (though it might even be useful if the backslash were removed from the result). Depends on the previous fix for 4.2-p36 2. IFS side-effects don't take effect during expansion. It isn't clear to me which of these are correct. Bash's interpretation is unique. for sh in bb {{d,b}a,po,{m,}k,z}sh; do printf '%-5s ' "${sh}:" "$sh" /dev/fd/0 done <<\EOF ${ZSH_VERSION+:} false && emulate sh set -f -- a b c unset -v IFS printf '<%s> ' ${*}${IFS=}${*}${IFS:=-}"${*}" echo EOF bb : <a b cabc> <a-b-c> dash: <a b cabc> <a-b-c> bash: <a> <b> <ca> <b> <c-a b c> posh: <a> <b> <ca b c> <a-b-c> mksh: <a> <b> <ca b c> <a-b-c> ksh : <a> <b> <ca> <b> <c> <a b c> zsh : <a> <b> <ca> <b> <c> <a-b-c> 3. Another IFS oddity via "command" IFS can be given "two values at once" through the environment of a redirection. $ ( set -- 1 2 3; IFS=foo; IFS=- command cat <<<"${IFS} ${*}" ) foo 1-2-3 $ ( set -- 1 2 3; IFS=foo; IFS=- cat <<<"${IFS} ${*}" ) foo 1f2f3 4. Command substitution in redirection evaluated twice on error. Reproduce by: $ { <$(echo $RANDOM >&3); } 3>&2 2>/dev/null 25449 8520 There is a 1-liner patch to redir.c for this which might help demonstrate (thanks to Eduardo A. Bustamante López <dual...@gmail.com>). Skipping this branch when expandable_redirection_filename is false bypasses a huge chunk that I haven't looked at closely. diff --git a/redir.c b/redir.c index 921be8c..f248fd7 100644 --- a/redir.c +++ b/redir.c @@ -153,7 +153,7 @@ redirection_error (temp, error) } } #endif - else if (expandable_redirection_filename (temp)) + else if (0) { expandable_filename: if (posixly_correct && interactive_shell == 0) -- Dan Douglas
signature.asc
Description: This is a digitally signed message part.