On Wed, Apr 27, 2016 at 07:33:25AM -0400, Grisha Levit wrote: > Sorry that wasn???t very clear. I only included that case to demonstrate that > seemingly contradictory things are happening: > > - "${_+$@}" expands each positional parameter to a separate word, > following the usual "$@" behavior
To be honest, this looks like a bug in the script to me. The script author intended ${_+"$@"} surely. Or more likely ${1+"$@"} which is an actual feature used in legacy shell scripts. The fact that "${_+$@}" and ${_+"$@"} both give the same thing when $@ is not empty seems like some sort of coincidence. Or, yet another trap for the unwary. "Hey, I tested it and it worked!" ... 2 months later ... "Shit, it didn't work in all cases." P.S. dash and ksh93 also give this result. > - The usual "$@" behavior is to expand to 0 words if there are no > positional params but in this case "${_+$@}" expands to an empty string > instead Again, this looks like a bug in the script. I don't know what it's supposed to do, but I know it should not have been written this way. Also again, ${_+"$@"} gets it right. Also also again, dash and ksh93 give the same result. I'll leave the "what should the shell do when the script author makes this particular bug" discussion to the rest of you. I just want to advise people to stop writing bugs. Really, your life gets simpler. (The fact that bash, dash and ksh93 all agree means it's probably the prescribed POSIX behavior, but I can't be bothered to research that. Hell, maybe all 3 shells just happen to have the same bug.)