On Friday, January 11, 2013 09:39:00 PM John Kearney wrote: > Am 11.01.2013 19:38, schrieb Dan Douglas: > > $ set --; printf %q\\n "$@" > > '' > > > > printf should perhaps only output '' when there is actually a corresponding > > empty argument, else eval "$(printf %q ...)" and similar may give different > > results than expected. Other shells don't output '', even mksh's ${var@Q} > > expansion. Zsh's ${(q)var} does. > > that is not a bug in printf %q > > it what you expect to happen with "${@}" > should that be 0 arguments if $# is 0. > > I however find the behavior irritating, but correct from the description. > > to do what you are suggesting you would need a special case handler for this > "${@}" as oposed to "jjjj${@}jjjjj" or any other variation. > > > what I tend to do as a workaround is > > printf() { > if [ $# -eq 2 -a -z "${2}" ];then > builtin printf "${1}" > else > builtin printf "${@}" > fi > } > > > or not as good but ok in most cases something like > > printf "%q" ${1:+"${@}"} > >
I don't understand what you mean. The issue I'm speaking of is that printf %q produces a quoted empty string both when given no args and when given one empty arg. A quoted "$@" with no positional parameters present expands to zero words (and correspondingly for "${arr[@]}"). Why do you think "x${@}x" is special? (Note that expansion didn't even work correctly a few patchsets ago.) Also as pointed out, every other shell with a printf %q feature disagrees with Bash. Are you saying that something in the manual says that it should do otherwise? I'm aware you could write a wrapper, I just don't see any utility in the default behavior. -- Dan Douglas