Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Possible :q quoting bug



Thanks! I suggest adding this little tidbit to the manpage.
I tested `”${(q@)@}” “${(q)@}” “${(qq@)@}”`. The only one to actually be idempotent (on my English locale at least) is `”${(q@)@}”. If you use `”${(qq@)@}”, you’ll lose aliases, which can be dangerous, when, e.g., you have aliases `rm` to `rm -i`. (Though generally I use aliases as little functions.)

> On Aug 9, 2019, at 2:18 AM, Stephane Chazelas <stephane.chazelas@xxxxxxxxx> wrote:
> 
> 2019-08-08 20:36:00 +0430, Aryn Starr:
>> I expect this function to be idempotent on the command line:
>> ```
>> Function reveal() {
>> eval “${@:q}”
>> }
>> ```
>> But it’s not. It loses empty args.
>> I have written the following function to fix this ‘bug’:
>> ```
>> gquote () {
>> 	local i
>> 	for i in "$@"
>> 	do
>> 		test -z "$i" && print -rn "''" " " || print -rn -- "${i:q}" " "
>> 	done
>> }
>> ```
> 
> You may want to use:
> 
> reveal() eval "${(qq)@}"
> 
> which is the zsh way to do it.
> 
> $var:q is reminiscent of tcsh's $var:q though works differently
> (in tcsh, you do need cmd $var:q to pass the content of $var
> literally to cmd as tcsh has a completly fucked-up way of
> handling parameter expansions (hardly improved from the Thompson
> shell's simplistic parameter expansion from the early 70s).
> 
> But like zsh's, tcsh's $var:q expands to nothing when $var is
> empty or a list of empty elements.
> 
> Of the various ${(q)var}, ${(qq)var}, ${(qqq)var}, ${(qqqq)var}
> ${(q+)var}..., ${(qq)var} is the only one that is
> localisation-safe as it always using single quotes. The other
> ones (and also the quoting operators of other shells or of
> various printf %q) are generally not safe as they may quote some
> characters with \ (or use things like $'\n') and the encoding of
> \ is found in the encoding of some multi-byte characters in some
> locales.
> 
> Note that mksh added a ${var@Q} which was later copied by bash.
> 
> Initially, ${empty@Q} expanded to nothing (and it still does in
> bash), but that changed at some point in mksh where it now
> expands to ''. (possibly bash will follow).
> 
> I'd agree zsh's documentation is misleading though as it
> currently says:
> 
> q
>     Quote the substituted words, escaping further substitutions.  Works
>     with history expansion and parameter expansion, though for
>     parameters it is only useful if the resulting text is to be
>     re-evaluated such as by eval.
> 
> 
> -- 
> Stephane



Messages sorted by: Reverse Date, Date, Thread, Author