zsh-workers
 help / color / mirror / code / Atom feed
From: Aryn Starr <whereislelouch@icloud.com>
To: Stephane Chazelas <stephane.chazelas@gmail.com>
Cc: zsh-workers@zsh.org
Subject: Re: Possible :q quoting bug
Date: Fri, 9 Aug 2019 15:30:40 +0430	[thread overview]
Message-ID: <37789068-9DCE-4B80-9C99-CEA8621F2895@icloud.com> (raw)
In-Reply-To: <20190808214818.fmfzcyqvzjtrmkpr@chaz.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 2533 bytes --]

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@gmail.com> 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


      reply	other threads:[~2019-08-09 11:01 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-08 16:06 Aryn Starr
2019-08-08 21:37 ` Bart Schaefer
2019-08-08 21:48 ` Stephane Chazelas
2019-08-09 11:00   ` Aryn Starr [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=37789068-9DCE-4B80-9C99-CEA8621F2895@icloud.com \
    --to=whereislelouch@icloud.com \
    --cc=stephane.chazelas@gmail.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).