Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: zsh -n does not detect incorrect associative array declaration
- X-seq: zsh-workers 38209
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: Re: zsh -n does not detect incorrect associative array declaration
- Date: Tue, 22 Mar 2016 23:40:54 -0700
- Cc: Paul Wayper <paulway@xxxxxxxxxx>
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=usApA4q4PecMBl2EKI6I8Qv4mbVnlCHLQP3PDZRdCP0=; b=NJY/ghRkzm15Ouw7+5JSH6Bh/djf8jaYn9fxlAYUWb33lZr4zUROzewxoSYPZmyJvI 7kpAPUmCujT16VCl4z069CnSbh4S3xQYq+nvhrXH4mLATJB6MIwIXYoHgmkQnpLcEAYc uFWF4Q7ySAFbyWlZP07tl5Fnco6vFqOEhwpi2yHf47QTAPxPXDSqoGc7VZ1V+a9bFv6/ 3p7ahgsh4qIBpZnj1/qAPSgu6iGWkrTkLvJuM610fsb8b53A9sU+V0E/ATINm7Rdt1WC wLTEGtC4QKUipl8pNvEpMHRiFla2hwIA18erINV58abndD9MP20w/JakP5mw/VYwG/hZ XTYw==
- In-reply-to: <56F1FF5F.6060907@redhat.com>
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- References: <56F1C3D7.6020800@redhat.com> <CAH+w=7YDbbw_J2G6BJKqi9=MtymqAQo1Zhv-19FGK0RqFnyScA@mail.gmail.com> <56F1FF5F.6060907@redhat.com>
On Tue, Mar 22, 2016 at 7:28 PM, Paul Wayper <paulway@xxxxxxxxxx> wrote:
> On 23/03/16 11:20, Bart Schaefer wrote:
>>
>> Technically, the shell is ALSO prohibited by NO_EXEC from executing
>> the "typeset" command, and therefore can't possibly know that "fn"
>> represents an associative array in the first place.
>>
>> The NO_EXEC option is only useful for the most rudimentary of syntax
>> checks. It cannot detect/predict execution-time inaccuracies.
>
> Given that situation, should we update the zsh manual to point out that
> the -n option cannot check the syntax of commands that are evaluated, so
> that this is more explicit? I'd be happy to write such an update and
> push it if you'd prefer that.
I don't have a preference here, but I don't think there's any reason
for the zsh manual to be any more explicit than the manual for any
other shell; for example bash:
-n Read commands but do not execute them. This may be used
to check a shell script for syntax errors. This is
ignored by interactive shells.
> However, I don't see why you can't at least check that the syntax is
> correct for things that don't use evaluation. That by far must be the
> majority of such cases.
There's nothing *syntactically* wrong with
fn=(foo_key foo_val bar_key)
Even when executing commands normally, the syntax analyzer does not
know that the assignment will fail if there are an odd number of
values in the list. That's a semantic error discoverable only when
the assignment is performed. The shell language is interpreted, not
truly compiled, so parameter type information is not used in syntax
analysis. Plus, you're still ignoring the fact that the shell doesn't
know "fn" is associative because it was not allowed to interpret the
foregoing "typeset" command.
Aside: In your original zsh_bad_array.zsh example you can tell that
it was a semantic/runtime error rather than a syntax error because
when the script was run WITHOUT "-n" the statements before and after
the bad assignment were still executed. An actual syntax error would
have aborted the entire script, probably with a "parse error" printed
to stderr.
Contrast this with ksh where associative array assignments look like
fn=( [foo_key]=foo_val [bar_key]= )
There the parser doesn't need to know the type of fn because the
association is explicit in the format of the parenthesized list. If
we ever get around to implementing that bit of ksh syntax your
assertion would become valid. (But in that case the assignment
forcibly changes the type of "fn" to become an associative array so
the typeset is irrelevant.)
Messages sorted by:
Reverse Date,
Date,
Thread,
Author