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
prev parent 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).