* NOMATCH errors
@ 2017-01-06 3:35 ` Anthony Heading
2017-01-06 11:49 ` Peter Stephenson
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Anthony Heading @ 2017-01-06 3:35 UTC (permalink / raw)
To: zsh-users
Hi,
I was dusting off an old script which, admittedly inelegantly, did
PYTHON==python 2>/dev/null
with NOMATCH set, which in the zsh 5 era seems to be a fatal error, i.e.
a script
echo hello
echo =hello =hello
echo "is there anybody in there?"
doesn't get past:
hello
hello:2: hello not found
Interestingly the docs perhaps arguably seem to imply differently:
Fatal errors found in non-interactive shells include:
[...]
o File generation failures where not caused by NO_MATCH or similar
options
So I was wondering the cleanest way to do this. `which python` is the
old-school
way, I guess, but the documentation isn't very reassuring about output
format
in case it happens to be an alias or a function or (heaven forfend)
python becomes
a shell builtin.
I played for a few minutes with a trivial patch at the end of this
email, which
aimed to make ==missing expand to an empty string. That to me seems a
helpful
behaviour, enables e.g. ${${:-==python}:-perl}, although it feels very
special
case syntax, maybe something as a variant or modifier on the :c
expansion would be
neater. But then if the idea is valid, maybe it sense to be able to
soft test tilde dir
expansion too; I'm not aware a nice way to look up single entries in
the hash tables, so maybe a general syntax for that could be better.
Any thoughts appreciated, especially if I'm missing a neat way to do
this.
Thanks
Anthony
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -623,13 +623,18 @@ char *
equalsubstr(char *str, int assign, int nomatch)
{
char *pp, *cnam, *cmdstr, *ret;
+ int nullmatch = str[0] == Equals;
for (pp = str; !isend2(*pp); pp++)
;
cmdstr = dupstrpfx(str, pp-str);
untokenize(cmdstr);
remnulargs(cmdstr);
+ if (nullmatch)
+ cmdstr++;
if (!(cnam = findcmd(cmdstr, 1, 0))) {
+ if (nullmatch)
+ return dupstring("");
if (nomatch)
zerr("%s not found", cmdstr);
return NULL;
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: NOMATCH errors
2017-01-06 3:35 ` NOMATCH errors Anthony Heading
@ 2017-01-06 11:49 ` Peter Stephenson
2017-01-06 16:05 ` Eric Cook
2017-01-08 18:35 ` Bart Schaefer
2 siblings, 0 replies; 5+ messages in thread
From: Peter Stephenson @ 2017-01-06 11:49 UTC (permalink / raw)
To: zsh-users
On Thu, 05 Jan 2017 22:35:21 -0500
Anthony Heading <anthony@ajrh.net> wrote:
> I was dusting off an old script which, admittedly inelegantly, did
> PYTHON==python 2>/dev/null
> with NOMATCH set, which in the zsh 5 era seems to be a fatal error, i.e.
> a script
Well, it's an error if python isn't actually found, in which case you're
setting PYTHON to =python. That's the sort of thing NOMATCH is designed
to trap. So it's not clear to me, given you're being careful about
failed matches, why you'd want to allow it to set a duff value in this
case.
You have more clumsy options like
() {
setopt localoptions nonnomatch
PYTHON==python
}
The multiple "=" syntax is certainly a possibility, although I'm not
100% convinced nobody's using commands that begin with an "=", which
isn't actually forbidden. Could alternatively be =~, since ~ needs
quoting anyway if you want to use it literally, so I think it's less
likely to break anything.
pws
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: NOMATCH errors
2017-01-06 3:35 ` NOMATCH errors Anthony Heading
2017-01-06 11:49 ` Peter Stephenson
@ 2017-01-06 16:05 ` Eric Cook
2017-01-07 2:37 ` Anthony Heading
2017-01-08 18:35 ` Bart Schaefer
2 siblings, 1 reply; 5+ messages in thread
From: Eric Cook @ 2017-01-06 16:05 UTC (permalink / raw)
To: zsh-users
On 01/05/2017 10:35 PM, Anthony Heading wrote:
> Hi,
>
> I was dusting off an old script which, admittedly inelegantly, did
> PYTHON==python 2>/dev/null
> with NOMATCH set, which in the zsh 5 era seems to be a fatal error, i.e.
> a script
>
> So I was wondering the cleanest way to do this. `which python` is the
> old-school
> way, I guess, but the documentation isn't very reassuring about output
> format
> Any thoughts appreciated, especially if I'm missing a neat way to do
> this.
>
> Thanks
>
> Anthony
zsh already hashes commands at startup, you can access that entry
with $commands[python]. Since what =python would resolve
to already hashed, just calling python is fine.
Unless the script installs python or an additional `python',
in the former case zsh will notice python isn't in the command hash
table, add it and run the command, all during the first time the script
calls python. In the latter case, if the additional
`python' binary is early in PATH and you want to use it, running
''rehash python'' would hash it.
If the point of PYTHON==python was just to use $PYTHON in place of
just python under the guise of "always use the absolute paths to
commands to prevent future PATH lookups" advise some people spout, it's
pretty superfluous since zsh already hashed the command and won't do
another PATH lookup unless you use rehash (hash -r) or =python.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: NOMATCH errors
2017-01-06 16:05 ` Eric Cook
@ 2017-01-07 2:37 ` Anthony Heading
0 siblings, 0 replies; 5+ messages in thread
From: Anthony Heading @ 2017-01-07 2:37 UTC (permalink / raw)
To: zsh-users
On Fri, Jan 06, 2017 at 11:05:47AM -0500, Eric Cook wrote:
> zsh already hashes commands at startup, you can access that entry
> with $commands[python]. Since what =python would resolve
> to already hashed, just calling python is fine.
Ah, spectacular. I searched zshparam manual wondering how I'd
missed that, I forgot totally about zsh modules. Think this is
perfect. Many thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: NOMATCH errors
2017-01-06 3:35 ` NOMATCH errors Anthony Heading
2017-01-06 11:49 ` Peter Stephenson
2017-01-06 16:05 ` Eric Cook
@ 2017-01-08 18:35 ` Bart Schaefer
2 siblings, 0 replies; 5+ messages in thread
From: Bart Schaefer @ 2017-01-08 18:35 UTC (permalink / raw)
To: zsh-users
On Jan 5, 10:35pm, Anthony Heading wrote:
}
} echo hello
} echo =hello =hello
} echo "is there anybody in there?"
}
} doesn't get past:
} hello
} hello:2: hello not found
}
} Interestingly the docs perhaps arguably seem to imply differently:
} Fatal errors found in non-interactive shells include:
} [...]
} o File generation failures where not caused by NO_MATCH or similar
} options
This particular bit of doc is out of date. Which is to say, either the
doc should have been changed or a bug was introduced.
This appears to date from workers/30789 which introduced the option
CONTINUE_ON_ERROR. This changed default startup-script behavior from
blowing right past all sorts of syntax problems, to aborting on those
errors. Setting the option restores the old behavior.
Unfortunately NO_MATCH errors got swept into the bucket along with all
the other startup-time errors, so there's now no way other than using
an "eval" wrapper or an "always" block to safely skip NO_MATCH errors
without also skipping more serious errors like broken loop control
syntax.
So ... either we need to undo that side-effect of CONTINUE_ON_ERROR or
we need to update the documentation quoted above.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-01-08 19:02 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <CGME20170106034111epcas4p3f9c5c44d3d8318b096fbe5c3dc899439@epcas4p3.samsung.com>
2017-01-06 3:35 ` NOMATCH errors Anthony Heading
2017-01-06 11:49 ` Peter Stephenson
2017-01-06 16:05 ` Eric Cook
2017-01-07 2:37 ` Anthony Heading
2017-01-08 18:35 ` Bart Schaefer
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).